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

深入分析 SpringMVC 參數(shù)解析器

開發(fā) 前端
HandlerMethodArgumentResolver 就是我們口口聲聲說的參數(shù)解析器,它的實(shí)現(xiàn)類還是蠻多的,因?yàn)槊恳环N類型的參數(shù)都對(duì)應(yīng)了一個(gè)參數(shù)解析器。

 [[388388]]

前面和大家聊了自定義 SpringMVC 參數(shù)解析器,同時(shí)我們也分析了幾個(gè)比較簡(jiǎn)單的參數(shù)解析器,相信大家對(duì)于 SpringMVC 中的參數(shù)解析器應(yīng)該已經(jīng)有了一定的了解,如果還沒看過的小伙伴可以先看看:SpringBoot 中如何自定義參數(shù)解析器?。

不過我相信很多小伙伴真正疑惑的是像下面這種接口,參數(shù)是怎么解析的:

  1. @GetMapping("/hello2"
  2. public void hello2(String name) { 
  3.     System.out.println("name = " + name); 

抑或者像下面這種接口,參數(shù)是怎么解析的:

  1. @GetMapping("/hello/{id}"
  2. public void hello3(@PathVariable Long id) { 
  3.     System.out.println("id = " + id); 

這是我們?nèi)粘V凶畛R姷膮?shù)定義方式,相信很多小伙伴對(duì)此很感興趣。由于這塊涉及到一個(gè)非常龐大的類 AbstractNamedValueMethodArgumentResolver,因此這里我單獨(dú)寫了一篇文章來和大家分享這個(gè)問題。

在正式分享之前,我們先來整體看看參數(shù)解析器都有哪些。

1.參數(shù)解析器

HandlerMethodArgumentResolver 就是我們口口聲聲說的參數(shù)解析器,它的實(shí)現(xiàn)類還是蠻多的,因?yàn)槊恳环N類型的參數(shù)都對(duì)應(yīng)了一個(gè)參數(shù)解析器:

為了理解方便,我們可以將這些參數(shù)解析器分為四大類:

  • xxxMethodArgumentResolver:這就是一個(gè)普通的參數(shù)解析器。
  • xxxMethodProcessor:不僅可以當(dāng)作參數(shù)解析器,還可以處理對(duì)應(yīng)類型的返回值。
  • xxxAdapter:這種不做參數(shù)解析,僅僅用來作為 WebArgumentResolver 類型的參數(shù)解析器的適配器。
  • HandlerMethodArgumentResolverComposite:這個(gè)看名字就知道是一個(gè)組合解析器,它是一個(gè)代理,具體代理其他干活的那些參數(shù)解析器。

大致上可以分為這四類,其中最重要的當(dāng)然就是前兩種了。

2.參數(shù)解析器概覽

接下來我們來先來大概看看這些參數(shù)解析器分別都是用來干什么的。

MapMethodProcessor

這個(gè)用來處理 Map/ModelMap 類型的參數(shù),解析完成后返回 model。

PathVariableMethodArgumentResolver

這個(gè)用來處理使用了 @PathVariable 注解并且參數(shù)類型不為 Map 的參數(shù),參數(shù)類型為 Map 則使用 PathVariableMapMethodArgumentResolver 來處理。

PathVariableMapMethodArgumentResolver

見上。

ErrorsMethodArgumentResolver

這個(gè)用來處理 Error 參數(shù),例如我們做參數(shù)校驗(yàn)時(shí)的 BindingResult。

AbstractNamedValueMethodArgumentResolver

這個(gè)用來處理 key/value 類型的參數(shù),如請(qǐng)求頭參數(shù)、使用了 @PathVariable 注解的參數(shù)以及 Cookie 等。

RequestHeaderMethodArgumentResolver

這個(gè)用來處理使用了 @RequestHeader 注解,并且參數(shù)類型不是 Map 的參數(shù)(參數(shù)類型是 Map 的使用 RequestHeaderMapMethodArgumentResolver)。

RequestHeaderMapMethodArgumentResolver

見上。

RequestAttributeMethodArgumentResolver

這個(gè)用來處理使用了 @RequestAttribute 注解的參數(shù)。

RequestParamMethodArgumentResolver

這個(gè)功能就比較廣了。使用了 @RequestParam 注解的參數(shù)、文件上傳的類型 MultipartFile、或者一些沒有使用任何注解的基本類型(Long、Integer)以及 String 等,都使用該參數(shù)解析器處理。需要注意的是,如果 @RequestParam 注解的參數(shù)類型是 Map,則該注解必須有 name 值,否則解析將由 RequestParamMapMethodArgumentResolver 完成。

RequestParamMapMethodArgumentResolver

見上。

AbstractCookieValueMethodArgumentResolver

這個(gè)是一個(gè)父類,處理使用了 @CookieValue 注解的參數(shù)。

ServletCookieValueMethodArgumentResolver

這個(gè)處理使用了 @CookieValue 注解的參數(shù)。

MatrixVariableMethodArgumentResolver

這個(gè)處理使用了 @MatrixVariable 注解并且參數(shù)類型不是 Map 的參數(shù),如果參數(shù)類型是 Map,則使用 MatrixVariableMapMethodArgumentResolver 來處理。

MatrixVariableMapMethodArgumentResolver

見上。

SessionAttributeMethodArgumentResolver

這個(gè)用來處理使用了 @SessionAttribute 注解的參數(shù)。

ExpressionValueMethodArgumentResolver

這個(gè)用來處理使用了 @Value 注解的參數(shù)。

ServletResponseMethodArgumentResolver

這個(gè)用來處理 ServletResponse、OutputStream 以及 Writer 類型的參數(shù)。

ModelMethodProcessor

這個(gè)用來處理 Model 類型參數(shù),并返回 model。

ModelAttributeMethodProcessor

這個(gè)用來處理使用了 @ModelAttribute 注解的參數(shù)。

SessionStatusMethodArgumentResolver

這個(gè)用來處理 SessionStatus 類型的參數(shù)。

PrincipalMethodArgumentResolver

這個(gè)用來處理 Principal 類型參數(shù),這個(gè)松哥在前面的文章中和大家介紹過了(SpringBoot 中如何自定義參數(shù)解析器?)。

AbstractMessageConverterMethodArgumentResolver

這是一個(gè)父類,當(dāng)使用 HttpMessageConverter 解析 requestbody 類型參數(shù)時(shí),相關(guān)的處理類都會(huì)繼承自它。

RequestPartMethodArgumentResolver

這個(gè)用來處理使用了 @RequestPart 注解、MultipartFile 以及 Part 類型的參數(shù)。

AbstractMessageConverterMethodProcessor

這是一個(gè)工具類,不承擔(dān)參數(shù)解析任務(wù)。

RequestResponseBodyMethodProcessor

這個(gè)用來處理添加了 @RequestBody 注解的參數(shù)。

HttpEntityMethodProcessor

這個(gè)用來處理 HttpEntity 和 RequestEntity 類型的參數(shù)。

ContinuationHandlerMethodArgumentResolver

AbstractWebArgumentResolverAdapter

這種不做參數(shù)解析,僅僅用來作為 WebArgumentResolver 類型的參數(shù)解析器的適配器。

ServletWebArgumentResolverAdapter

這個(gè)給父類提供 request。

UriComponentsBuilderMethodArgumentResolver

這個(gè)用來處理 UriComponentsBuilder 類型的參數(shù)。

ServletRequestMethodArgumentResolver

這個(gè)用來處理 WebRequest、ServletRequest、MultipartRequest、HttpSession、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId 類型的參數(shù)。

HandlerMethodArgumentResolverComposite

這個(gè)看名字就知道是一個(gè)組合解析器,它是一個(gè)代理,具體代理其他干活的那些參數(shù)解析器。

RedirectAttributesMethodArgumentResolver

這個(gè)用來處理 RedirectAttributes 類型的參數(shù),RedirectAttributes 松哥在之前的文章中和大家介紹過:SpringMVC 中的參數(shù)還能這么傳遞?漲姿勢(shì)了!。

好了,各個(gè)參數(shù)解析器的大致功能就給大家介紹完了,接下來我們選擇其中一種,來具體說說它的源碼。

3.AbstractNamedValueMethodArgumentResolver

AbstractNamedValueMethodArgumentResolver 是一個(gè)抽象類,一些鍵值對(duì)類型的參數(shù)解析器都是通過繼承它實(shí)現(xiàn)的,它里邊定義了很多這些鍵值對(duì)類型參數(shù)解析器的公共操作。

AbstractNamedValueMethodArgumentResolver 中也是應(yīng)用了很多模版模式,例如它沒有實(shí)現(xiàn) supportsParameter 方法,該方法的具體實(shí)現(xiàn)在不同的子類中,resolveArgument 方法它倒是實(shí)現(xiàn)了,我們一起來看下:

  1. @Override 
  2. @Nullable 
  3. public final Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, 
  4.   NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { 
  5.  NamedValueInfo namedValueInfo = getNamedValueInfo(parameter); 
  6.  MethodParameter nestedParameter = parameter.nestedIfOptional(); 
  7.  Object resolvedName = resolveEmbeddedValuesAndExpressions(namedValueInfo.name); 
  8.  if (resolvedName == null) { 
  9.   throw new IllegalArgumentException( 
  10.     "Specified name must not resolve to null: [" + namedValueInfo.name + "]"); 
  11.  } 
  12.  Object arg = resolveName(resolvedName.toString(), nestedParameter, webRequest); 
  13.  if (arg == null) { 
  14.   if (namedValueInfo.defaultValue != null) { 
  15.    arg = resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue); 
  16.   } 
  17.   else if (namedValueInfo.required && !nestedParameter.isOptional()) { 
  18.    handleMissingValue(namedValueInfo.name, nestedParameter, webRequest); 
  19.   } 
  20.   arg = handleNullValue(namedValueInfo.name, arg, nestedParameter.getNestedParameterType()); 
  21.  } 
  22.  else if ("".equals(arg) && namedValueInfo.defaultValue != null) { 
  23.   arg = resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue); 
  24.  } 
  25.  if (binderFactory != null) { 
  26.   WebDataBinder binder = binderFactory.createBinder(webRequest, null, namedValueInfo.name); 
  27.   try { 
  28.    arg = binder.convertIfNecessary(arg, parameter.getParameterType(), parameter); 
  29.   } 
  30.   catch (ConversionNotSupportedException ex) { 
  31.    throw new MethodArgumentConversionNotSupportedException(arg, ex.getRequiredType(), 
  32.      namedValueInfo.name, parameter, ex.getCause()); 
  33.   } 
  34.   catch (TypeMismatchException ex) { 
  35.    throw new MethodArgumentTypeMismatchException(arg, ex.getRequiredType(), 
  36.      namedValueInfo.name, parameter, ex.getCause()); 
  37.   } 
  38.   // Check for null value after conversion of incoming argument value 
  39.   if (arg == null && namedValueInfo.defaultValue == null && 
  40.     namedValueInfo.required && !nestedParameter.isOptional()) { 
  41.    handleMissingValue(namedValueInfo.name, nestedParameter, webRequest); 
  42.   } 
  43.  } 
  44.  handleResolvedValue(arg, namedValueInfo.name, parameter, mavContainer, webRequest); 
  45.  return arg; 
  1. 首先根據(jù)當(dāng)前請(qǐng)求獲取一個(gè) NamedValueInfo 對(duì)象,這個(gè)對(duì)象中保存了參數(shù)的三個(gè)屬性:參數(shù)名、參數(shù)是否必須以及參數(shù)默認(rèn)值。具體的獲取過程就是先去緩存中拿,緩存中如果有,就直接返回,緩存中如果沒有,則調(diào)用 createNamedValueInfo 方法去創(chuàng)建,將創(chuàng)建結(jié)果緩存起來并返回。createNamedValueInfo 方法是一個(gè)模版方法,具體的實(shí)現(xiàn)在子類中。
  2. 接下來處理 Optional 類型參數(shù)。
  3. resolveEmbeddedValuesAndExpressions 方法是為了處理注解中使用了 SpEL 表達(dá)式的情況,例如如下接口:
  1. @GetMapping("/hello2"
  2. public void hello2(@RequestParam(value = "${aa.bb}") String name) { 
  3.     System.out.println("name = " + name); 

參數(shù)名使用了表達(dá)式,那么 resolveEmbeddedValuesAndExpressions 方法的目的就是解析出表達(dá)式的值,如果沒用到表達(dá)式,那么該方法會(huì)將原參數(shù)原封不動(dòng)返回。4. 接下來調(diào)用 resolveName 方法解析出參數(shù)的具體值,這個(gè)方法也是一個(gè)模版方法,具體的實(shí)現(xiàn)在子類中。5. 如果獲取到的參數(shù)值為 null,先去看注解中有沒有默認(rèn)值,然后再去看參數(shù)值是否是必須的,如果是,則拋異常出來,否則就設(shè)置為 null 即可。6. 如果解析出來的參數(shù)值為空字符串 "",則也去 resolveEmbeddedValuesAndExpressions 方法中走一遭。7. 最后則是 WebDataBinder 的處理,解決一些全局參數(shù)的問題,WebDataBinder 松哥在之前的文章中也有介紹過,傳送門:@ControllerAdvice 的三種使用場(chǎng)景。

大致的流程就是這樣。

在這個(gè)流程中,我們看到主要有如下兩個(gè)方法是在子類中實(shí)現(xiàn)的:

  • createNamedValueInfo
  • resolveName

在加上 supportsParameter 方法,子類中一共有三個(gè)方法需要我們重點(diǎn)分析。

那么接下來我們就以 RequestParamMethodArgumentResolver 為例,來看下這三個(gè)方法。

4.RequestParamMethodArgumentResolver

4.1 supportsParameter

  1. @Override 
  2. public boolean supportsParameter(MethodParameter parameter) { 
  3.  if (parameter.hasParameterAnnotation(RequestParam.class)) { 
  4.   if (Map.class.isAssignableFrom(parameter.nestedIfOptional().getNestedParameterType())) { 
  5.    RequestParam requestParam = parameter.getParameterAnnotation(RequestParam.class); 
  6.    return (requestParam != null && StringUtils.hasText(requestParam.name())); 
  7.   } 
  8.   else { 
  9.    return true
  10.   } 
  11.  } 
  12.  else { 
  13.   if (parameter.hasParameterAnnotation(RequestPart.class)) { 
  14.    return false
  15.   } 
  16.   parameter = parameter.nestedIfOptional(); 
  17.   if (MultipartResolutionDelegate.isMultipartArgument(parameter)) { 
  18.    return true
  19.   } 
  20.   else if (this.useDefaultResolution) { 
  21.    return BeanUtils.isSimpleProperty(parameter.getNestedParameterType()); 
  22.   } 
  23.   else { 
  24.    return false
  25.   } 
  26.  } 
  27. public static boolean isSimpleProperty(Class<?> type) { 
  28.  return isSimpleValueType(type) || (type.isArray() && isSimpleValueType(type.getComponentType())); 
  29. public static boolean isSimpleValueType(Class<?> type) { 
  30.  return (Void.class != type && void.class != type && 
  31.    (ClassUtils.isPrimitiveOrWrapper(type) || 
  32.    Enum.class.isAssignableFrom(type) || 
  33.    CharSequence.class.isAssignableFrom(type) || 
  34.    Number.class.isAssignableFrom(type) || 
  35.    Date.class.isAssignableFrom(type) || 
  36.    Temporal.class.isAssignableFrom(type) || 
  37.    URI.class == type || 
  38.    URL.class == type || 
  39.    Locale.class == type || 
  40.    Class.class == type)); 

從 supportsParameter 方法中可以非常方便的看出支持的參數(shù)類型:

  1. 首先參數(shù)如果有 @RequestParam 注解的話,則分兩種情況:參數(shù)類型如果是 Map,則 @RequestParam 注解必須配置 name 屬性,否則不支持;如果參數(shù)類型不是 Map,則直接返回 true,表示總是支持(想想自己平時(shí)使用的時(shí)候是不是這樣)。
  2. 參數(shù)如果含有 @RequestPart 注解,則不支持。
  3. 檢查下是不是文件上傳請(qǐng)求,如果是,返回 true 表示支持。
  4. 如果前面都沒能返回,則使用默認(rèn)的解決方案,判斷是不是簡(jiǎn)單類型,主要就是 Void、枚舉、字符串、數(shù)字、日期等等。
  5. 這塊代碼其實(shí)很簡(jiǎn)單,支持誰不支持誰,一目了然。

4.2 createNamedValueInfo

  1. @Override 
  2. protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) { 
  3.  RequestParam ann = parameter.getParameterAnnotation(RequestParam.class); 
  4.  return (ann != null ? new RequestParamNamedValueInfo(ann) : new RequestParamNamedValueInfo()); 
  5. private static class RequestParamNamedValueInfo extends NamedValueInfo { 
  6.  public RequestParamNamedValueInfo() { 
  7.   super(""false, ValueConstants.DEFAULT_NONE); 
  8.  } 
  9.  public RequestParamNamedValueInfo(RequestParam annotation) { 
  10.   super(annotation.name(), annotation.required(), annotation.defaultValue()); 
  11.  } 

獲取注解,讀取注解中的屬性,構(gòu)造 RequestParamNamedValueInfo 對(duì)象返回。

4.3 resolveName

  1. @Override 
  2. @Nullable 
  3. protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception { 
  4.  HttpServletRequest servletRequest = request.getNativeRequest(HttpServletRequest.class); 
  5.  if (servletRequest != null) { 
  6.   Object mpArg = MultipartResolutionDelegate.resolveMultipartArgument(name, parameter, servletRequest); 
  7.   if (mpArg != MultipartResolutionDelegate.UNRESOLVABLE) { 
  8.    return mpArg; 
  9.   } 
  10.  } 
  11.  Object arg = null
  12.  MultipartRequest multipartRequest = request.getNativeRequest(MultipartRequest.class); 
  13.  if (multipartRequest != null) { 
  14.   List<MultipartFile> files = multipartRequest.getFiles(name); 
  15.   if (!files.isEmpty()) { 
  16.    arg = (files.size() == 1 ? files.get(0) : files); 
  17.   } 
  18.  } 
  19.  if (arg == null) { 
  20.   String[] paramValues = request.getParameterValues(name); 
  21.   if (paramValues != null) { 
  22.    arg = (paramValues.length == 1 ? paramValues[0] : paramValues); 
  23.   } 
  24.  } 
  25.  return arg; 

這個(gè)方法思路也比較清晰:

  1. 前面兩個(gè) if 主要是為了處理文件上傳請(qǐng)求。
  2. 如果不是文件上傳請(qǐng)求,則調(diào)用 request.getParameterValues 方法取出參數(shù)返回即可。

整個(gè)過程還是比較 easy 的。小伙伴們可以在此基礎(chǔ)之上自行分析 PathVariableMethodArgumentResolver 的原理,也很容易。

5.小結(jié)

今天主要和小伙伴們梳理了 SpringMVC 參數(shù)解析器的整個(gè)體系,關(guān)于這些解析器在何時(shí)被配置,在何時(shí)被調(diào)用,松哥在后面的文章中會(huì)和大家繼續(xù)分析。好啦,今天就說這么多。

本文轉(zhuǎn)載自微信公眾號(hào)「江南一點(diǎn)雨」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系江南一點(diǎn)雨公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 江南一點(diǎn)雨
相關(guān)推薦

2021-04-13 12:55:06

SpringMVC解析器接口

2009-12-14 14:50:46

Ruby傳參數(shù)

2021-03-26 11:00:50

SpringMVC組件接口

2022-11-18 08:32:23

spring參數(shù)解析器

2010-09-07 14:21:22

PPPoE協(xié)議

2022-04-12 08:30:45

TomcatWeb 應(yīng)用Servlet

2011-03-23 11:01:55

LAMP 架構(gòu)

2009-11-30 14:15:17

Cisco路由器配置實(shí)

2010-03-08 14:53:48

Linux分區(qū)

2023-02-01 08:13:30

Redis內(nèi)存碎片

2011-09-01 13:51:52

JavaScript

2025-09-16 10:57:31

2009-12-16 16:39:01

Visual Stud

2022-08-30 07:00:18

執(zhí)行引擎Hotspot虛擬機(jī)

2021-10-29 16:36:53

AMSAndroidActivityMan

2009-06-10 18:12:38

Equinox動(dòng)態(tài)化OSGi動(dòng)態(tài)化

2009-12-23 09:06:34

網(wǎng)吧路由器

2009-12-16 13:26:10

2009-12-21 15:58:08

路由器基礎(chǔ)知識(shí)

2009-12-18 15:12:46

備份路由器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本免费观看网站| 欧美高清一区二区| 国产污片在线观看| 亚洲自拍电影| 欧美日韩国产一区| 日韩精品在线中文字幕| 日韩av资源| 男女激情视频一区| 欧美极品美女视频网站在线观看免费 | 久久婷婷亚洲| 色婷婷av一区二区三区久久| 蜜臀aⅴ国产精品久久久国产老师| 粉嫩一区二区| 亚洲精品你懂的| 精品免费二区三区三区高中清不卡 | 免费成人av电影| 国内精品视频一区二区三区八戒| 97免费视频在线| 永久av免费网站| 婷婷国产精品| 欧美一级艳片视频免费观看| 日本成年人网址| 超碰最新在线| 国产视频一区二区在线| 国产99在线免费| 92久久精品一区二区| 亚洲尤物精选| 欧美大片免费观看| 最新日韩免费视频| 日韩三级视频| 精品少妇一区二区| 中国黄色片一级| 桃花岛成人影院| 亚洲成人精品一区二区| 伊人av成人| 国产精品一区二区三区四区色| 成人性色生活片| 91社区国产高清| 国产精品尤物视频| 欧美亚洲自偷自偷| 国语自产精品视频在线看| avove在线播放| 亚洲精品电影| 久久精品一偷一偷国产| 国产精品久久免费观看| 亚洲婷婷伊人| 亚洲欧美在线免费| 美国黄色a级片| 欧美日韩看看2015永久免费 | 亚洲日韩视频| 欧美精品video| 九九视频免费观看| 欧美1区2区3区| 久久精品夜夜夜夜夜久久| 欧美福利在线视频| 99久久视频| 久久精彩免费视频| 夫妻性生活毛片| 91精品一区二区三区综合在线爱 | 久久久久亚洲AV成人无在| 亚洲第一福利社区| 亚洲日本成人女熟在线观看| 日本黄色特级片| 日韩一级电影| 亚洲欧洲激情在线| 日本美女xxx| 91日韩免费| 欧美成人免费全部| 久久久久无码国产精品不卡| 欧美日韩精品一本二本三本| 久久久久久成人| 国产午夜性春猛交ⅹxxx| 亚洲永久字幕| 国产精品久久久久久久久久久久久久 | 欧美xxxxx精品| 婷婷综合电影| 亚洲欧美在线免费观看| av片在线免费看| 欧美 日韩 国产 一区| 欧美黑人视频一区| aaa人片在线| 日本va欧美va精品| 亚洲va电影大全| 国产1区在线观看| wwwwxxxxx欧美| 亚洲成人自拍| 尤物在线网址| 精品人伦一区二区三区蜜桃免费 | 国产一区亚洲一区| 国产福利久久精品| 午夜影院免费视频| 国产午夜精品美女毛片视频| 亚洲国产一区二区精品视频| 国产盗摄在线观看| 激情久久av一区av二区av三区| 免费日韩中文字幕| www.久久爱.com| 亚洲精品国产综合区久久久久久久| 真实乱视频国产免费观看| 欧美1级片网站| 久久久久久美女| 中文字幕免费视频观看| 国产.欧美.日韩| 欧美污视频久久久| 日本精品600av| 欧美日韩亚洲精品内裤| 在线一区二区不卡| 天堂成人娱乐在线视频免费播放网站| 日韩在线免费av| 亚欧视频在线观看| 国内精品自线一区二区三区视频| 国产一区二区三区av在线| 在线毛片网站| 色综合久久综合网97色综合| 下面一进一出好爽视频| 国产欧美日韩精品一区二区免费| 美日韩丰满少妇在线观看| www.国产一区二区| 国产激情一区二区三区| 亚洲国产精品视频一区| 国产资源在线观看入口av| 91精品国产91久久久久久一区二区 | 800av在线免费观看| yy6080久久伦理一区二区| 亚洲国产精品va在线看黑人 | 牛夜精品久久久久久久99黑人| 日韩免费观看视频| 神马午夜一区二区| 亚洲一区二区精品视频| 精品久久久99| 精品日本12videosex| 97视频在线免费观看| 国产av无码专区亚洲a∨毛片| 久久久精品天堂| 日韩a在线播放| 奇米影视777在线欧美电影观看 | 国产美女在线观看一区| 日韩aⅴ视频一区二区三区| 国产激情视频在线看| 日韩亚洲欧美成人一区| 麻豆视频在线免费看| 免费成人在线观看视频| 神马影院我不卡| 亚洲成人av观看| 亚洲热线99精品视频| 亚洲天堂视频网站| 91久色porny| 成人观看免费完整观看| 日韩欧美中文字幕电影| 97超级碰碰人国产在线观看| 后进极品白嫩翘臀在线视频| 亚洲日本在线天堂| 91精品国产三级| 一区二区三区在线| 亚洲影院高清在线| 污视频网站在线免费| 欧美一个色资源| 久久亚洲av午夜福利精品一区| 国产精品综合久久| 国产精品igao激情视频| 一级毛片精品毛片| 国内久久久精品| 亚洲三区在线播放| 欧美性开放视频| 日本一区二区视频在线播放| 奇米影视一区二区三区| 在线观看日韩片| 久久综合偷偷噜噜噜色| 欧美激情精品久久久久久免费印度| www黄色网址| 五月天激情小说综合| 免费在线观看成年人视频| 视频一区二区欧美| 在线免费一区| 福利片一区二区| 日韩av快播网址| 欧美激情午夜| 日韩精品一区二区三区在线| 日韩美女一级片| 久久久久久久综合色一本| 国产精品v日韩精品v在线观看| 欧美黄色大片在线观看| 99超碰麻豆| 91av亚洲| 久久久精品电影| 五十路在线观看| 欧美日韩免费在线视频| 欧美精品一区二区蜜桃| 99久久精品国产精品久久| 一级片视频免费观看| 欧美午夜国产| 神马影院午夜我不卡影院| 精品视频在线播放一区二区三区 | 精品一区二区三区四区五区| 久久久久久免费精品| 国产福利片在线| 日韩欧美一区二区在线视频| 五月婷婷视频在线| 亚洲视频在线一区二区| 国产吞精囗交久久久| 精品一区二区三区欧美| 国产av天堂无码一区二区三区| 日韩欧美大片| 精品综合在线| 在线欧美激情| 国产成人aa精品一区在线播放| 黄色在线免费网站| 精品亚洲一区二区三区在线播放 | 另类专区亚洲| 欧美黑人极品猛少妇色xxxxx| 丁香婷婷在线| 日韩电影第一页| 国产乱码精品一区二区| 一本色道久久综合精品竹菊| 青青草在线观看视频| 中文字幕av一区二区三区| 秘密基地免费观看完整版中文 | 午夜在线电影亚洲一区| frxxee中国xxx麻豆hd| 国产亚洲欧美激情| 亚洲国产综合视频| 国产91精品久久久久久久网曝门 | 中文字幕精品在线| 欧美xxx.com| 日韩电视剧在线观看免费网站| 国产特黄一级片| 欧美日韩视频专区在线播放| 欧美精品韩国精品| 欧美日韩另类在线| 久久在线视频精品| 亚洲卡通欧美制服中文| 欧美一级片在线视频| 欧美激情一区在线观看| 9.1成人看片| jlzzjlzz亚洲日本少妇| 中文字幕在线播放一区二区| 激情五月婷婷综合| 中文字幕 91| 美女爽到高潮91| 亚洲国产精品嫩草影院久久| 999精品视频在线观看播放| 久久精品男人的天堂| 97人妻天天摸天天爽天天| 国产成人av电影在线观看| 九色91porny| 国产精品18久久久久久久久| 国产欧美一区二| 黄页网站大全一区二区| 人人爽人人爽av| 精品一区二区三区在线视频| 午夜国产一区二区三区| 欧美日韩日本国产亚洲在线 | 国产成人精品一区二区免费看京 | 欧美成人精品xxx| 亚洲淫性视频| 久久国产精品免费视频| 欧美尤物美女在线| 北条麻妃99精品青青久久| 调教视频免费在线观看| 综合欧美国产视频二区| www.国产精品.com| 久久久电影免费观看完整版| 1769在线观看| 日韩在线免费视频观看| 在线观看wwwxxxx| 久久久久久久久久亚洲| 国模雨婷捆绑高清在线| 97免费视频在线| 涩涩网在线视频| 欧美一级大片视频| 国产一区二区精品调教| 日韩av免费在线| 全球最大av网站久久| 亚洲一区二区日本| 欧美a级大片在线| 不卡视频一区二区| 中文字幕精品影院| 日韩在线第一区| 日韩欧美自拍| 9色porny| 国产亚洲毛片| 国产精品拍拍拍| 懂色av一区二区在线播放| 国产精品日日摸夜夜爽| av电影在线观看完整版一区二区| 中文字幕第20页| 最新久久zyz资源站| 男人的天堂久久久| 欧美日韩一区二区三区在线免费观看| 久久精品视频5| 欧美日韩久久不卡| 性网爆门事件集合av| 日韩av影视在线| 黄网页免费在线观看| 欧美激情图片区| 黄视频网站在线观看| 国产精品自拍视频| 136福利精品导航| 另类欧美小说| 欧美福利专区| 那种视频在线观看| 久久99国产精品久久| 麻豆国产精品一区| 椎名由奈av一区二区三区| 精品在线视频免费观看| 欧美中文字幕久久| 亚洲欧美激情另类| 国产亚洲欧美另类中文| 国产精选在线| 国产精品主播视频| 国产精品xxx在线观看| 婷婷四月色综合| 亚洲精品1区| 免费激情视频在线观看| 国产精品资源在线看| 中文字幕av观看| 久久久高清一区二区三区| 日韩 欧美 精品| 欧美另类z0zxhd电影| 国产私拍精品| 午夜精品一区二区三区在线视频| 成人不卡视频| 欧洲高清一区二区| 亚洲网站啪啪| 在线观看国产一级片| 久久精品一区二区三区四区 | 最新热久久免费视频| 国产性生活视频| 亚洲第一精品福利| 国产秀色在线www免费观看| 国产精品久久久久免费a∨| 久久香蕉网站| 日韩精品一区二区三区四| 乱一区二区av| 中文字幕网站在线观看| 亚洲va欧美va人人爽| 国产激情久久久久久熟女老人av| 亚洲精美色品网站| 日本欧美电影在线观看| 成人性生交xxxxx网站| av中文字幕一区二区| 亚洲 高清 成人 动漫| 99久久综合99久久综合网站| 免费三片在线播放| 欧美精品高清视频| 国产精品刘玥久久一区| 国产精品一区二区久久久久| 欧美三级美国一级| 亚洲爆乳无码专区| av成人老司机| 国产无套丰满白嫩对白| 亚洲激情视频在线| 求av网址在线观看| 97免费资源站| 国产精品www994| 艳妇乳肉豪妇荡乳xxx| 亚洲综合免费观看高清完整版| 国产精品久久久午夜夜伦鲁鲁| 久久久精品日本| 国产精品一区二区三区av | 91精品视频免费观看| 日韩激情在线| 中文字幕亚洲影院| 国产精品国产自产拍高清av| 成年人视频免费| 麻豆国产精品va在线观看不卡| 国产精品一区三区在线观看| 久久久久久久香蕉| 国产成人精品亚洲777人妖| 唐朝av高清盛宴| 亚洲欧美精品一区| 韩国成人漫画| 三级网在线观看| 国产伦精品一区二区三区视频青涩 | 国产亚洲美州欧州综合国| 中文字幕一区二区三区四区欧美| 最新的欧美黄色| 欧美大片网站| 久久久久99精品成人片| 99热国产精品| 亚洲中文字幕无码爆乳av| 久热精品在线视频| 国产一区调教| 中文字幕 91| 一区二区日韩电影| 午夜国产在线视频| 91丝袜美腿美女视频网站| 好看的av在线不卡观看| 国产jjizz一区二区三区视频| 欧美亚洲综合色| 日本高清视频在线播放| 国产麻豆一区二区三区在线观看| 亚洲一区一卡| 成人免费视频国产免费观看| 日韩女优制服丝袜电影| 成人黄色动漫| 亚洲欧美日本国产有色| 国产成人在线视频免费播放| 波多野结衣一区二区在线| 久久综合伊人77777蜜臀|