精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring MVC 異常解析器,原理就是這么簡單

開發 前端
因為@ExceptionHandler注解的方式已經足夠強大,所以我們一般也很少通過實現HandlerExceptionResolver來自定義異常處理策略。

[[330436]]

使用介紹

一般自定義異常處理策略有兩種方式

  1. 使用@ExceptionHandler注解
  2. 實現HandlerExceptionResolver接口

因為@ExceptionHandler注解的方式已經足夠強大,所以我們一般也很少通過實現HandlerExceptionResolver來自定義異常處理策略。

簡單介紹一下@ExceptionHandler的使用,后面會結合這些例子進行源碼分析

  1. @RestController 
  2. @RequestMapping("location"
  3. public class LocationController { 
  4.  
  5.  @RequestMapping("getLocationInfo"
  6.  public String index() { 
  7.   int sum = 10 / 0; 
  8.   return "locationInfo"
  9.  } 
  10.  
  11.  @ExceptionHandler(RuntimeException.class) 
  12.  public String processRuntimeException() { 
  13.   return "LocationController -> 發生RuntimeException"
  14.  } 
  15.  
  16.  @ExceptionHandler(Exception.class) 
  17.  public String processException() { 
  18.   return "LocationController -> 發生Exception"
  19.  } 

訪問如下鏈接,返回結果為

  1. http://localhost:8080/location/getLocationInfo 
  2. LocationController -> 發生RuntimeException 

把processRuntimeException方法注釋掉以后,再次訪問上面的鏈接,結果為

  1. LocationController -> 發生Exception 

如果在每個Controller里面都寫異常解析器還是很麻煩的,能不能在一個地方統一處理異常呢?當然可以,這時候就不得不用到@RestControllerAdvice或者@ControllerAdvice

寫如下的全局異常解析器

  1. @RestControllerAdvice 
  2. public class MyExceptionHandler { 
  3.  
  4.  @ExceptionHandler(RuntimeException.class) 
  5.  public String processRuntimeException() { 
  6.   return "MyExceptionHandler -> 發生RuntimeException"
  7.  } 
  8.  
  9.  @ExceptionHandler(Exception.class) 
  10.  public String processException() { 
  11.   return "MyExceptionHandler -> 發生RuntimeException"
  12.  } 

訪問上面的鏈接,返回結果為

  1. LocationController -> 發生Exception 

我們把LocationController類的processException方法也注釋掉,此時LocationController類里面已經沒有被@ExceptionHandler注解標記的方法了

訪問上面的鏈接,返回結果為

  1. MyExceptionHandler -> 發生RuntimeException 

把MyExceptionHandler中的processRuntimeException方法注釋掉訪問上面的鏈接,返回結果為

  1. MyExceptionHandler -> 發生Exception 

通過以上的例子,我們可以得出如下結論

 

  1. @RestControllerAdvice或者@ControllerAdvice類內的解析器的優先級低于@RequestMapping類的解析器的優先級
  2. 如果一個異常能被多個解析器所處理,則選擇繼承關系最近的解析器

假設BizException繼承自NullPointException A方法解析BizException B方法解析NullPointException C方法解析Exception

BizException會被A方法解析 NullPointException會被B方法解析 如果沒有A方法,則BizException會被B方法解析,如果B方法也沒有,則被C方法解析,不難理解哈

@RestControllerAdvice和@ControllerAdvice有什么區別呢?

名字上就可以猜出@RestControllerAdvice只是在@ControllerAdvice的基礎上加了@ResponseBody注解,看一波源碼也確實如此。所以@RestControllerAdvice類最終返回的是JSON,@ControllerAdvice最終返回的是視圖。如果你不明白為什么加了@ResponseBody注解最終返回的內容為JSON,建議看一下返回值處理器相關的內容

源碼分析

異常解析器接口定義如下

  1. public interface HandlerExceptionResolver { 
  2.  
  3.  // 將異常封裝為ModelAndView后返回 
  4.  @Nullable 
  5.  ModelAndView resolveException( 
  6.    HttpServletRequest request, HttpServletResponse response,  
  7.    @Nullable Object handler, Exception ex); 
  8.  

Spring MVC默認的異常解析器存放在如下屬性中

  1. @Nullable 
  2. private List<HandlerExceptionResolver> handlerExceptionResolvers; 

順序依次為

 

  • ExceptionHandlerExceptionResolver
  • ResponseStatusExceptionResolver
  • DefaultHandlerExceptionResolver

UML圖如下

Order接口是用來排序的哈,Spring MVC默認的解析器不是通過Order接口來控制順序的,因為默認的解析器都繼承自AbstractHandlerExceptionResolver,并且都沒有重寫getOrder方法

對Spring MVC比較清楚的小伙伴應該都知道DispatcherServlet屬性的默認實現都定義在源碼包的DispatcherServlet.properties文件中,List的順序也是按這個來的。放一部分內容

  1. org.springframework.web.servlet.HandlerAdapter= 
  2.     org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ 
  3.  org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ 
  4.  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 
  5.  
  6. org.springframework.web.servlet.HandlerExceptionResolver= 
  7.     org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\ 
  8.  org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ 
  9.  org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionReso 

接下來分析這3個默認的HandlerExceptionResolver

ExceptionHandlerExceptionResolver

ExceptionHandlerExceptionResolver用于支持@ExceptionHandler,而@ExceptionHandler應該是我們最常的,方便我們自定義異常處理策略,比通過實現HandlerExceptionResolver接口的方式簡單

從AbstractHandlerMethodExceptionResolver#shouldApplyTo可以看到

  1. @Override 
  2. protected boolean shouldApplyTo(HttpServletRequest request, @Nullable Object handler) { 
  3.  if (handler == null) { 
  4.   // handler為空,交給父類去判斷 
  5.   // 默認該邏輯返回true 
  6.   return super.shouldApplyTo(request, null); 
  7.  } 
  8.  else if (handler instanceof HandlerMethod) { 
  9.   HandlerMethod handlerMethod = (HandlerMethod) handler; 
  10.   handler = handlerMethod.getBean(); 
  11.   // 交給父類判斷 
  12.   return super.shouldApplyTo(request, handler); 
  13.  } 
  14.  else { 
  15.   // 不支持 
  16.   return false
  17.  } 

只有當handler為空或者handler的類型為HandlerMethod時(@RequestMapping返回的類型為HandlerMethod)才會執行后面的異常解析邏輯。所以你通過實現Controller接口或者實現HttpRequestHandler接口定義的Handler,這個注解是不起作用的

@ExceptionHandler的處理過程主要和下面2個類有關系ExceptionHandlerExceptionResolver,ExceptionHandlerMethodResolver

用幾個成員變量說一下處理過程,就不貼過多的代碼了

ExceptionHandlerExceptionResolver

  1. // 省略了繼承和實現關系 
  2. public class ExceptionHandlerExceptionResolver { 
  3.  
  4.  @Nullable 
  5.  private HandlerMethodArgumentResolverComposite argumentResolvers; 
  6.  
  7.  @Nullable 
  8.  private HandlerMethodReturnValueHandlerComposite returnValueHandlers; 
  9.  
  10.  private List<HttpMessageConverter<?>> messageConverters; 
  11.  
  12.  
  13.  // 被@RequestMapping標記的類 -> ExceptionHandlerMethodResolver 
  14.  private final Map<Class<?>, ExceptionHandlerMethodResolver>  
  15.  exceptionHandlerCache = new ConcurrentHashMap<>(64); 
  16.  
  17.  // 被@ControllerAdvice注解標記的類 -> ExceptionHandlerMethodResolver 
  18.  private final Map<ControllerAdviceBean, ExceptionHandlerMethodResolver> 
  19.  exceptionHandlerAdviceCache = new LinkedHashMap<>(); 

可以看到ExceptionHandlerExceptionResolver類定義了自己的參數處理器,返回值處理器,消息轉換器。所以你可以通過這些組件反向知道@ExceptionHandler方法支持的參數類型

例如從如下方法可以知道,支持的參數類型為@SessionAttribute,@RequestAttribute等 如果你寫個@RequestParam是肯定不會注入進來的

  1. protected List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() { 
  2.  List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>(); 
  3.  
  4.  // Annotation-based argument resolution 
  5.  resolvers.add(new SessionAttributeMethodArgumentResolver()); 
  6.  resolvers.add(new RequestAttributeMethodArgumentResolver()); 
  7.  
  8.  // Type-based argument resolution 
  9.  resolvers.add(new ServletRequestMethodArgumentResolver()); 
  10.  resolvers.add(new ServletResponseMethodArgumentResolver()); 
  11.  resolvers.add(new RedirectAttributesMethodArgumentResolver()); 
  12.  resolvers.add(new ModelMethodProcessor()); 
  13.  
  14.  // Custom arguments 
  15.  if (getCustomArgumentResolvers() != null) { 
  16.   resolvers.addAll(getCustomArgumentResolvers()); 
  17.  } 
  18.  
  19.  return resolvers; 

最重要的4個map來了,ExceptionHandlerExceptionResolver的工作過程主要就是操作這4個map

  1. // 省略了繼承和實現關系 
  2. public class ExceptionHandlerExceptionResolver { 
  3.  
  4.  // 被@RequestMapping標記的類 -> ExceptionHandlerMethodResolver 
  5.  private final Map<Class<?>, ExceptionHandlerMethodResolver> 
  6.  exceptionHandlerCache = new ConcurrentHashMap<>(64); 
  7.  
  8.  // 被@ControllerAdvice注解標記的類 -> ExceptionHandlerMethodResolver 
  9.  private final Map<ControllerAdviceBean, ExceptionHandlerMethodResolver> 
  10.  exceptionHandlerAdviceCache = new LinkedHashMap<>(); 
  11.     

exceptionHandlerCache保存了@RequestMapping對應的ExceptionHandlerMethodResolver,是在執行異常解析的過程中被賦值的

exceptionHandlerAdviceCache保存了@ControllerAdvice對應的 ExceptionHandlerMethodResolver,是在ExceptionHandlerExceptionResolver被初始化的過程中賦值的

而ExceptionHandlerMethodResolver你可以認為只是封裝了一下Exception及其對應的Method

以最開始的例子演示,ExceptionHandlerExceptionResolver初始化后

此時exceptionHandlerCache是沒有值的 訪問如下鏈接后

  1. http://localhost:8080/location/getLocationInfo 

exceptionHandlerCache中的值如下,LocationController及其對應的ExceptionHandlerMethodResolver被放了進來追一下以下方法的執行 ExceptionHandlerExceptionResolver#doResolveHandlerMethodException ExceptionHandlerExceptionResolver#getExceptionHandlerMethod

可以得出我們測試的結論@RestControllerAdvice或者@ControllerAdvice類內的解析器的優先級低于@RequestMapping類的解析器的優先級

總體實現也不難,從exceptionHandlerCache中能找到解析器就返回執行,找不到就從exceptionHandlerAdviceCache中找,這不是就實現了優先級了嗎?

接著來看剩下的2個Map

  1. public class ExceptionHandlerMethodResolver { 
  2.  
  3.  
  4.  // 異常 -> 對應的處理方法 
  5.  private final Map<Class<? extends Throwable>, Method> 
  6.  mappedMethods = new HashMap<>(16); 
  7.  
  8.  // 異常 -> 對應的處理方法 
  9.  // 這個是基于mappedMethods又做了一次緩存 
  10.  // 為什么要再做一次緩存呢? 
  11.  // 是因為根據異常類型獲取處理方法的時候,一個異常可能有多個處理方法,即一個異常會從mappedMethods中查出多個處理方法 
  12.  // 最后返回的是繼承關系最近的異常對應的處理方法,所以在查找的時候又做了一次緩存,避免每次查mappedMethods然后取最優值 
  13.  // 從exceptionLookupCache中就可以直接查到最優的處理方法 
  14.  private final Map<Class<? extends Throwable>, Method> 
  15.  exceptionLookupCache = new ConcurrentReferenceHashMap<>(16); 
  16.   

@ControllerAdvice的mappedMethods是在ExceptionHandlerExceptionResolver初始化的過程中賦值的

@RequestMapping的mappedMethods是在執行異常解析的過程中被賦值的

而exceptionLookupCache是在異常解析過程中,通過Exception查找Method的過程中基于mappedMethods做的緩存

為什么在查找過程中要再做一次緩存呢?

是因為根據異常類型獲取處理方法的時候,一個異常可能有多個處理方法,即一個異常會從mappedMethods中查出多個處理方法,最后返回的是繼承關系最近的異常對應的處理方法,所以在查找的時候又做了一次緩存,避免每次查mappedMethods然后取最優值。從exceptionLookupCache中就可以直接查到最優的處理方法

以LocationController為例,查找一次異常后,exceptionLookupCache的值如下

這樣當再次發生ArithmeticException異常時就能從exceptionLookupCache找到對應的處理方法

ResponseStatusExceptionResolver

ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver的實現都不是很難,就不進行過多的分析了

ResponseStatusExceptionResolver主要用來處理如下異常

拋出的異常類型繼承自ResponseStatusException

拋出的異常類型被@ResponseStatus標記

以一個例子來演示這個處理器的功能

  1. @ResponseStatus(HttpStatus.UNAUTHORIZED) 
  2. public class UnauthorizedException extends RuntimeException { 
  3. @RestController 
  4. @RequestMapping("shoppingCar"
  5. public class ShoppingCarController { 
  6.  
  7.  @RequestMapping("getCarInfo"
  8.  public String index() { 
  9.   throw new UnauthorizedException(); 
  10.  } 

訪問

  1. http://localhost:8080/shoppingCar/getCarInfo 

顯示如下

DefaultHandlerExceptionResolver

用來處理一些常見的Http異常,如

400:請求無效 405:請求方法不支持 500:內部服務器錯誤

執行入口

  1. # DispatcherServlet#processDispatchResult的部分方法 
  2. // 處理過程發生了異常 
  3. if (exception != null) { 
  4.  if (exception instanceof ModelAndViewDefiningException) { 
  5.   logger.debug("ModelAndViewDefiningException encountered", exception); 
  6.   // 直接使用異常中封裝的ModelAndView作為最終的ModelAndView結果 
  7.   mv = ((ModelAndViewDefiningException) exception).getModelAndView(); 
  8.  } 
  9.  else { 
  10.   // 其他異常類型,先獲取解析器 
  11.   Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null); 
  12.   // 通過異常解析器將異常解析為一個錯誤視圖 
  13.   mv = processHandlerException(request, response, handler, exception); 
  14.   errorView = (mv != null); 
  15.  } 

如果整個處理過程發生異常,依次調用DispatcherServlet的成員變量handlerExceptionResolvers的resolveException方法,找到第一個不為null的ModelAndView,然后返回

  1. @Nullable 
  2. private List<HandlerExceptionResolver> handlerExceptionResolvers; 

本文轉載自微信公眾號「Java識堂」,可以通過以下二維碼關注。轉載本文請聯系Java識堂公眾號。

 

責任編輯:武曉燕 來源: Java識堂
相關推薦

2021-05-24 10:50:10

Git命令Linux

2017-11-28 15:29:04

iPhone X網頁適配

2012-01-09 16:28:01

筆記本評測

2009-12-14 18:59:27

Ruby解析器

2020-06-16 10:57:20

搭建

2024-08-28 08:42:21

API接口限流

2016-07-22 15:12:12

Win10技巧重裝

2020-09-24 10:26:43

運維開發技術

2021-02-26 10:21:35

比特幣投資金融

2023-02-23 08:15:33

Spring異常處理機制

2021-12-27 07:31:37

JavaNeo4J數據庫

2023-08-26 21:42:08

零拷貝I/O操作

2020-04-20 10:47:57

Redis數據開發

2021-10-28 19:23:27

界面嵌入式 UI

2019-05-13 08:24:58

數據庫MySQLInnoDB

2023-07-27 08:26:36

零拷貝I/O操作

2024-02-27 08:14:51

Nginx跨域服務

2023-07-10 08:00:13

架構Rest返回值

2011-05-24 09:22:44

Spring3異常處理

2009-03-19 09:26:05

RSS解析器MagpieRSS
點贊
收藏

51CTO技術棧公眾號

一区二区三区亚洲| 色88888久久久久久影院野外 | 国产精品日韩一区二区| 你懂的国产视频| 精品一级毛片| 欧美一区二区日韩一区二区| 国产在线视频在线| 男人天堂亚洲二区| 久久99精品一区二区三区| 欧美日韩成人在线视频| 女同毛片一区二区三区| 亚洲美女色播| 精品成人乱色一区二区| 亚洲一区二区三区精品在线观看 | 极品尤物av久久免费看| 97在线看福利| 91 在线视频| 最新国产精品视频| 日韩欧美一区二区视频| 虎白女粉嫩尤物福利视频| 黄色网在线免费看| 久久亚洲精品国产精品紫薇| 91日本在线观看| 综合网在线观看| 欧美私人啪啪vps| 一本色道久久综合狠狠躁篇的优点 | 99免费在线视频观看| 无码人妻精品一区二| 狠狠入ady亚洲精品经典电影| 亚洲国产精品国自产拍av秋霞| 污视频网站观看| 午夜裸体女人视频网站在线观看| 亚洲视频一二区| 污视频在线免费观看一区二区三区| www.国产免费| 紧缚奴在线一区二区三区| 国产成人福利网站| www.youjizz.com亚洲| 亚洲国产一区二区三区在线播放| 亚洲色图欧美制服丝袜另类第一页 | 三级在线看中文字幕完整版| 亚洲色图一区二区| 亚洲激情一区二区| youjizz在线播放| 久久你懂得1024| 精品国产一区二区三区日日嗨 | 国产在线精品一区在线观看麻豆| 日韩免费中文字幕| 国产性猛交╳xxx乱大交| 伊人激情综合| 久久久久免费视频| www.av视频| 亚洲无中文字幕| 不卡中文字幕av| 国产精品麻豆免费版现看视频| 中文字幕av一区二区三区人| 亚洲毛片在线观看| 国产美女喷水视频| 视频一区欧美| 一区二区三欧美| 亚洲午夜精品久久久久久高潮| 狠狠色狠狠色综合婷婷tag| 亚洲女成人图区| 成人国产精品久久久网站| 国产伦一区二区三区| 亚洲色图偷窥自拍| 国产精品酒店视频| 99精品全国免费观看视频软件| 日韩视频免费在线观看| 日本在线一级片| 91欧美大片| 欧美日韩国产123| 国产视频91在线| 久久久亚洲人| 国产日韩在线免费| 国产极品999| 99视频精品全部免费在线| 美脚丝袜一区二区三区在线观看| 日韩专区一区二区| 国产精品乱人伦中文| 91嫩草国产丨精品入口麻豆| 国产白丝在线观看| 色诱亚洲精品久久久久久| 手机看片福利日韩| 日韩精品一区国产| 精品偷拍一区二区三区在线看 | 黄色av一区二区三区| 白白色 亚洲乱淫| 欧美日韩电影一区二区| 免费在线观看av网站| 亚洲一卡二卡三卡四卡无卡久久| 亚洲午夜无码av毛片久久| 999国产精品亚洲77777| 日韩美女视频一区二区在线观看| 北岛玲一区二区| 日韩片欧美片| 国内精品一区二区三区四区| 国产精品欧美综合| 成人午夜av影视| 日本在线视频一区| 久草在线新免费首页资源站| 色哦色哦哦色天天综合| 杨幂一区二区国产精品| 精品一区毛片| 久久99久国产精品黄毛片入口| 欧美特黄aaaaaa| 国产精品乡下勾搭老头1| 欧美日产一区二区三区在线观看| 最新日本在线观看| 色美美综合视频| 动漫av在线免费观看| 欧美日韩老妇| 97精品视频在线播放| 国产精选久久久| 91免费视频观看| 中文字幕の友人北条麻妃| 亚洲www免费| 亚洲国产天堂网精品网站| 成人免费黄色小视频| 久久精品一区| 国产嫩草一区二区三区在线观看 | 九九精品视频在线观看| 国产午夜无码视频在线观看| 成人黄页在线观看| 欧美三级午夜理伦三级老人| 影音成人av| 日韩激情视频在线播放| 久久久久亚洲AV成人| 麻豆精品新av中文字幕| 欧美中日韩免费视频| 国产在线美女| 欧美r级电影在线观看| 欧美日韩黄色网| 麻豆成人久久精品二区三区小说| 欧美区高清在线| 中文字幕乱码中文乱码51精品| 精品乱人伦小说| h色网站在线观看| 久久69国产一区二区蜜臀| 日韩影院一区| 三上悠亚激情av一区二区三区| 亚洲精品国精品久久99热一| 国产性70yerg老太| 国产 日韩 欧美大片| 国产亚洲精品久久久久久久| 国产精品一区二区美女视频免费看 | 欧美精品 - 色网| 99久久夜色精品国产亚洲96| 91精品久久久久久久久青青 | 这里只有精品9| 国产欧美日韩中文久久| 国产熟女高潮视频| 久久99青青| 日韩美女视频中文字幕| 国产三区四区在线观看| 欧洲另类一二三四区| 男人舔女人下部高潮全视频| 日韩电影在线观看电影| 色狠狠久久av五月综合| 国产黄色精品| 久久精品色欧美aⅴ一区二区| 国产一区二区三区成人| 亚洲欧美另类小说视频| 久久久久99人妻一区二区三区| 欧美日韩国产高清| 国产亚洲精品自在久久| 综合久久2023| 中文字幕国产精品久久| 国产视频第二页| 一区二区三区四区在线播放| 少妇精品无码一区二区三区| 欧美一级久久| 亚洲国产一区在线| 99精品在免费线中文字幕网站一区| 午夜精品理论片| 国产小视频在线| 欧美年轻男男videosbes| 登山的目的在线| 东方欧美亚洲色图在线| www国产黄色| 日韩在线看片| 国产精品免费区二区三区观看| 国产高潮在线| 色视频www在线播放国产成人| 一二三区在线播放| 亚洲午夜一区二区三区| 在线观看福利片| 国产一区二区三区在线观看免费| 一卡二卡三卡视频| 欧美日韩国产传媒| 国产66精品久久久久999小说| 亚洲天堂导航| 久热精品在线视频| 亚洲欧美日韩免费| 欧美高清性hdvideosex| 91精品国产高潮对白| 欧美国产视频在线| 精品人妻一区二区免费| 日韩激情在线观看| 国产传媒久久久| 色琪琪久久se色| 精品乱子伦一区二区三区| 未满十八勿进黄网站一区不卡| 久久久女女女女999久久| av在线日韩国产精品| 亚洲福利小视频| 91高潮大合集爽到抽搐| 婷婷开心激情综合| 久久精品黄色片| 久久精品欧美一区二区三区不卡| 国产又粗又猛又爽又黄| 丝袜美腿高跟呻吟高潮一区| 国产小视频免费| 91久久夜色精品国产按摩| 欧美日韩日本网| 成人18夜夜网深夜福利网| 国产精品一区二区3区| 欧美三级网站| 久久久免费在线观看| 自拍亚洲图区| 久久精品国产欧美激情| 大乳在线免费观看| 亚洲精品mp4| 亚洲精品中文字幕成人片| 欧美日韩五月天| 亚洲av无码不卡| 欧美日韩精品在线播放| 国产在线观看免费av| 亚洲欧美一区二区三区孕妇| 一级特黄曰皮片视频| 91蜜桃免费观看视频| 蜜臀av粉嫩av懂色av| 粉嫩av亚洲一区二区图片| 午夜av中文字幕| 六月丁香婷婷色狠狠久久| jizz欧美激情18| 久久国产精品99国产| 日本中文字幕网址| 影音先锋久久| 91九色丨porny丨国产jk| 亚洲视频高清| 久久99中文字幕| 黄色成人91| 欧美国产综合在线| 亚洲视频久久| 国产美女在线一区| 亚洲久久一区| 丰满爆乳一区二区三区| 夜久久久久久| 日本在线观看a| 久久综合图片| 黄色aaa级片| 久色婷婷小香蕉久久| 99热一区二区| 国产麻豆视频精品| 中文字幕1区2区| 成人国产免费视频| 成人性生活免费看| 久久女同性恋中文字幕| 91资源在线播放| 中文字幕制服丝袜成人av | 午夜影院免费观看视频| 国产精品亚洲一区二区三区在线| 人妻精油按摩bd高清中文字幕| 国产成人在线看| 国产xxxxxxxxx| 久久久久一区二区三区四区| 国产精品久久免费观看| 亚洲欧美影音先锋| 国产一级二级三级| 精品二区三区线观看| 久久久久久久久久一区| 外国成人毛片| 97视频中文字幕| 国内精品在线视频| 色妞久久福利网| 久久一卡二卡| 欧美中文字幕视频| 精品久久99| 福利视频一区二区三区| 天天久久夜夜| 亚洲一区二区不卡视频| 韩日视频一区| www黄色在线| 国产一区二区三区高清播放| 污污免费在线观看| 久久九九久久九九| 少妇影院在线观看| 色综合天天综合网天天狠天天| 中文字幕在线观看免费| 日韩精品专区在线影院观看| 欧美91精品久久久久国产性生爱| 久久久国产精品x99av| 9765激情中文在线| 国产欧美在线观看| 青青草原在线亚洲| 黄瓜视频免费观看在线观看www | 男女激烈动态图| 亚洲深夜av| 搡的我好爽在线观看免费视频| 99re在线精品| www.99re7| 色狠狠桃花综合| 性一交一乱一色一视频麻豆| 亚洲午夜激情免费视频| 国产后进白嫩翘臀在线观看视频| 国产精品青青在线观看爽香蕉| a看欧美黄色女同性恋| 亚洲一二区在线| 国产日韩视频| 久久黄色一级视频| 亚洲国产精品激情在线观看| 日韩三级免费看| 日韩亚洲欧美一区| 在线免费观看黄| 日韩美女免费线视频| 久久aimee| 久久久久久久香蕉| 久久99精品久久久| 影音先锋男人在线| 狠狠躁夜夜躁久久躁别揉| 成人高潮片免费视频| 日韩视频中文字幕| 欧美大片1688网站| 欧美精品一区在线| 亚洲精品黄色| 一区二区三区四区影院| 亚洲精品国产无天堂网2021| 中文字幕理论片| 亚洲天堂久久av| 神马午夜在线视频| 狠狠干一区二区| 精品69视频一区二区三区Q| 下面一进一出好爽视频| 中文字幕一区在线| 亚洲永久精品视频| 最近中文字幕日韩精品| 成人看片毛片免费播放器| 青青影院一区二区三区四区| 欧美亚洲一区| 亚洲av无码一区二区二三区| 婷婷亚洲久悠悠色悠在线播放| 欧美 日韩 中文字幕| 久久久免费av| 狼人精品一区二区三区在线 | 在线看片中文字幕| 欧美亚男人的天堂| a天堂中文在线88| 国产精品视频精品| 国产精品久久久久蜜臀| 激情文学亚洲色图| 亚洲精品中文字幕乱码三区| 国产99对白在线播放| 欧美精品久久久久久久久久| 9l视频自拍蝌蚪9l视频成人| 成人性免费视频| 91麻豆视频网站| 亚洲精品成人在线视频| 一区二区国产精品视频| 四虎国产精品成人免费影视| 国产高清精品软男同| 粉嫩绯色av一区二区在线观看| 日韩av男人天堂| 亚洲欧美国产精品va在线观看| 99久久精品一区二区成人| 亚洲在线视频一区二区| 国产麻豆视频一区| 日韩精品久久久久久久酒店| 亚洲欧美综合v| 中文成人在线| 激情五月婷婷六月| 久久日一线二线三线suv| 中文字幕第三页| 欧美黑人巨大精品一区二区| 欧美一区二区三区红桃小说| 狠狠操精品视频| 亚洲欧美日韩在线不卡| 五月激情婷婷网| 国产精品视频精品视频| 国产一区激情| 亚洲第一香蕉网| 欧美日本免费一区二区三区| 免费av不卡在线观看| 欧美不卡1区2区3区| 国产在线观看一区二区| 日本道在线观看| 色噜噜狠狠狠综合曰曰曰 | 免费黄网站欧美| 精品爆乳一区二区三区无码av| 亚洲精品综合精品自拍| 超碰国产精品一区二页| 国产3p露脸普通话对白| 国产精品美女久久久久久2018| 成人福利小视频| 国产精品免费一区豆花| 亚洲国产黄色| 中文字幕观看av| 国产婷婷97碰碰久久人人蜜臀 | 国产精品我不卡| 日韩不卡一区二区|