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

SpringBoot 中如何自定義參數(shù)解析器?

開發(fā) 架構(gòu)
在一個(gè) Web 請(qǐng)求中,參數(shù)我們無非就是放在地址欄或者請(qǐng)求體中,個(gè)別請(qǐng)求可能放在請(qǐng)求頭中。

[[387869]]

在一個(gè) Web 請(qǐng)求中,參數(shù)我們無非就是放在地址欄或者請(qǐng)求體中,個(gè)別請(qǐng)求可能放在請(qǐng)求頭中。

放在地址欄中,我們可以通過如下方式獲取參數(shù):

  1. String javaboy = request.getParameter("name "); 

放在請(qǐng)求體中,如果是 key/value 形式,我們可以通過如下方式獲取參數(shù):

  1. String javaboy = request.getParameter("name "); 

如果是 JSON 形式,我們則通過如果如下方式獲取到輸入流,然后解析成 JSON 字符串,再通過 JSON 工具轉(zhuǎn)為對(duì)象:

  1. BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream())); 
  2. String json = reader.readLine(); 
  3. reader.close(); 
  4. User user = new ObjectMapper().readValue(json, User.class); 

如果參數(shù)放在請(qǐng)求頭中,我們可以通過如下方式獲取:

  1. String javaboy = request.getHeader("name"); 

如果你用的是 Jsp/Servlet 那一套技術(shù)棧,那么參數(shù)獲取無外乎這幾種方式。

如果用了 SpringMVC 框架,有的小伙伴們可能會(huì)覺得參數(shù)獲取方式太豐富了,各種注解如 @RequestParam、@RequestBody、@RequestHeader、@PathVariable,參數(shù)可以是 key/value 形式,也可以是 JSON 形式,非常豐富!但是,無論多么豐富,最底層獲取參數(shù)的方式無外乎上面幾種。

那有小伙伴要問了,SpringMVC 到底是怎么樣從 request 中把參數(shù)提取出來直接給我們用的呢?例如下面這個(gè)接口:

  1. @RestController 
  2. public class HelloController { 
  3.     @GetMapping("/hello"
  4.     public String hello(String name) { 
  5.         return "hello "+name
  6.     } 

我們都知道 name 參數(shù)是從 HttpServletRequest 中提取出來的,到底是怎么提取出來的?這就是松哥今天要和大家分享的話題。

1.自定義參數(shù)解析器

為了搞清楚這個(gè)問題,我們先來自定義一個(gè)參數(shù)解析器看看。

自定義參數(shù)解析器需要實(shí)現(xiàn) HandlerMethodArgumentResolver 接口,我們先來看看該接口:

  1. public interface HandlerMethodArgumentResolver { 
  2.  boolean supportsParameter(MethodParameter parameter); 
  3.  @Nullable 
  4.  Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, 
  5.    NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception; 
  6.  

這個(gè)接口中就兩個(gè)方法:

  • supportsParameter:該方法表示是否啟用這個(gè)參數(shù)解析器,返回 true 表示啟用,返回 false 表示不啟用。
  • resolveArgument:這是具體的解析過程,就是從 request 中取出參數(shù)的過程,方法的返回值就對(duì)應(yīng)了接口中參數(shù)的值。

自定義參數(shù)解析器只需要實(shí)現(xiàn)該接口即可。

假設(shè)我現(xiàn)在有這樣一個(gè)需求(實(shí)際上在 Spring Security 中獲取當(dāng)前登錄用戶名非常方便,這里只是為了該案例而做,勿抬杠):

假設(shè)我現(xiàn)在系統(tǒng)安全框架使用了 Spring Security(對(duì) Spring Security 不熟悉的小伙伴,可以在公眾號(hào)江南一點(diǎn)雨后臺(tái)回復(fù) ss,有教程),如果我在接口的參數(shù)上添加了 @CurrentUserName 注解,那么該參數(shù)的值就是當(dāng)前登錄的用戶名,像下面這樣:

  1. @RestController 
  2. public class HelloController { 
  3.     @GetMapping("/hello"
  4.     public String hello(@CurrentUserName String name) { 
  5.         return "hello "+name
  6.     } 

要實(shí)現(xiàn)這個(gè)功能,非常 easy,首先我們自定義一個(gè) @CurrentUserName 注解,如下:

  1. @Retention(RetentionPolicy.RUNTIME) 
  2. @Target(ElementType.PARAMETER) 
  3. public @interface CurrentUserName { 

這個(gè)注解沒啥好解釋的。

接下來我們自定義參數(shù)解析器 CurrentUserNameHandlerMethodArgumentResolver,如下:

  1. public class CurrentUserNameHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { 
  2.     @Override 
  3.     public boolean supportsParameter(MethodParameter parameter) { 
  4.         return parameter.getParameterType().isAssignableFrom(String.class)&&parameter.hasParameterAnnotation(CurrentUserName.class); 
  5.     } 
  6.  
  7.     @Override 
  8.     public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { 
  9.         User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
  10.         return user.getUsername(); 
  11.     } 

supportsParameter:如果參數(shù)類型是 String,并且參數(shù)上有 @CurrentUserName 注解,則使用該參數(shù)解析器。

resolveArgument:該方法的返回值就是參數(shù)的具體值,當(dāng)前登錄用戶名從 SecurityContextHolder 中獲取即可(具體參數(shù)松哥的 Spring Security 教程,公號(hào)后臺(tái)回復(fù) ss)。

最后,我們?cè)賹⒆远x的參數(shù)解析器配置到 HandlerAdapter 中,配置方式如下:

  1. @Configuration 
  2. public class WebConfig implements WebMvcConfigurer { 
  3.     @Override 
  4.     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { 
  5.         resolvers.add(new CurrentUserNameHandlerMethodArgumentResolver()); 
  6.     } 

至此,就算配置完成了。

接下來啟動(dòng)項(xiàng)目,用戶登錄成功后,訪問 /hello 接口,就可以看到返回當(dāng)前登錄用戶數(shù)據(jù)了。

這就是我們自定義的一個(gè)參數(shù)類型解析器??梢钥吹?,非常 Easy。

在 SpringMVC 中,默認(rèn)也有很多 HandlerMethodArgumentResolver 的實(shí)現(xiàn)類,他們處理的問題也都類似,松哥再給大家舉個(gè)例子。

2.PrincipalMethodArgumentResolver

如果我們?cè)陧?xiàng)目中使用了 Spring Security,我們可以通過如下方式獲取當(dāng)前登錄用戶信息:

  1. @GetMapping("/hello2"
  2. public String hello2(Principal principal) { 
  3.     return "hello " + principal.getName(); 

即直接在當(dāng)前接口的參數(shù)中添加 Principal 類型的參數(shù)即可,該參數(shù)描述了當(dāng)前登錄用戶信息,這個(gè)用過 Spring Security 的小伙伴應(yīng)該都知道(不熟悉 Spring Security 的小伙伴可以在公眾號(hào)【江南一點(diǎn)雨】后臺(tái)回復(fù) ss)。

那么這個(gè)功能是怎么實(shí)現(xiàn)的呢?當(dāng)然就是 PrincipalMethodArgumentResolver 在起作用了!

我們一起來看下這個(gè)參數(shù)解析器:

  1. public class PrincipalMethodArgumentResolver implements HandlerMethodArgumentResolver { 
  2.  
  3.  @Override 
  4.  public boolean supportsParameter(MethodParameter parameter) { 
  5.   return Principal.class.isAssignableFrom(parameter.getParameterType()); 
  6.  } 
  7.  
  8.  @Override 
  9.  public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, 
  10.    NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { 
  11.  
  12.   HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); 
  13.   if (request == null) { 
  14.    throw new IllegalStateException("Current request is not of type HttpServletRequest: " + webRequest); 
  15.   } 
  16.  
  17.   Principal principal = request.getUserPrincipal(); 
  18.   if (principal != null && !parameter.getParameterType().isInstance(principal)) { 
  19.    throw new IllegalStateException("Current user principal is not of type [" + 
  20.      parameter.getParameterType().getName() + "]: " + principal); 
  21.   } 
  22.  
  23.   return principal; 
  24.  } 
  25.  

supportsParameter:這個(gè)方法主要是判斷參數(shù)類型是不是 Principal,如果參數(shù)類型是 Principal,就支持。

resolveArgument:這個(gè)方法的邏輯很簡(jiǎn)單,首先獲取原生的請(qǐng)求,再?gòu)恼?qǐng)求中獲取 Principal 對(duì)象返回即可。

是不是很簡(jiǎn)單,有了這個(gè),我們就可以隨時(shí)加載到當(dāng)前登錄用戶信息了。

3.RequestParamMapMethodArgumentResolver

松哥再給大家舉個(gè)例子:

  1. @RestController 
  2. public class HelloController { 
  3.     @PostMapping("/hello"
  4.     public void hello(@RequestParam MultiValueMap map) throws IOException { 
  5.         //省略... 
  6.     } 

這個(gè)接口很多小伙伴可能都寫過,使用 Map 去接收前端傳來的參數(shù),那么這里用到的參數(shù)解析器就是 RequestParamMapMethodArgumentResolver。

  1. public class RequestParamMapMethodArgumentResolver implements HandlerMethodArgumentResolver { 
  2.  
  3.  @Override 
  4.  public boolean supportsParameter(MethodParameter parameter) { 
  5.   RequestParam requestParam = parameter.getParameterAnnotation(RequestParam.class); 
  6.   return (requestParam != null && Map.class.isAssignableFrom(parameter.getParameterType()) && 
  7.     !StringUtils.hasText(requestParam.name())); 
  8.  } 
  9.  
  10.  @Override 
  11.  public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, 
  12.    NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { 
  13.  
  14.   ResolvableType resolvableType = ResolvableType.forMethodParameter(parameter); 
  15.  
  16.   if (MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) { 
  17.    // MultiValueMap 
  18.    Class<?> valueType = resolvableType.as(MultiValueMap.class).getGeneric(1).resolve(); 
  19.    if (valueType == MultipartFile.class) { 
  20.     MultipartRequest multipartRequest = MultipartResolutionDelegate.resolveMultipartRequest(webRequest); 
  21.     return (multipartRequest != null ? multipartRequest.getMultiFileMap() : new LinkedMultiValueMap<>(0)); 
  22.    } 
  23.    else if (valueType == Part.class) { 
  24.     HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class); 
  25.     if (servletRequest != null && MultipartResolutionDelegate.isMultipartRequest(servletRequest)) { 
  26.      Collection<Part> parts = servletRequest.getParts(); 
  27.      LinkedMultiValueMap<String, Part> result = new LinkedMultiValueMap<>(parts.size()); 
  28.      for (Part part : parts) { 
  29.       result.add(part.getName(), part); 
  30.      } 
  31.      return result; 
  32.     } 
  33.     return new LinkedMultiValueMap<>(0); 
  34.    } 
  35.    else { 
  36.     Map<String, String[]> parameterMap = webRequest.getParameterMap(); 
  37.     MultiValueMap<String, String> result = new LinkedMultiValueMap<>(parameterMap.size()); 
  38.     parameterMap.forEach((keyvalues) -> { 
  39.      for (String value : values) { 
  40.       result.add(key, value); 
  41.      } 
  42.     }); 
  43.     return result; 
  44.    } 
  45.   } 
  46.  
  47.   else { 
  48.    // Regular Map 
  49.    Class<?> valueType = resolvableType.asMap().getGeneric(1).resolve(); 
  50.    if (valueType == MultipartFile.class) { 
  51.     MultipartRequest multipartRequest = MultipartResolutionDelegate.resolveMultipartRequest(webRequest); 
  52.     return (multipartRequest != null ? multipartRequest.getFileMap() : new LinkedHashMap<>(0)); 
  53.    } 
  54.    else if (valueType == Part.class) { 
  55.     HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class); 
  56.     if (servletRequest != null && MultipartResolutionDelegate.isMultipartRequest(servletRequest)) { 
  57.      Collection<Part> parts = servletRequest.getParts(); 
  58.      LinkedHashMap<String, Part> result = CollectionUtils.newLinkedHashMap(parts.size()); 
  59.      for (Part part : parts) { 
  60.       if (!result.containsKey(part.getName())) { 
  61.        result.put(part.getName(), part); 
  62.       } 
  63.      } 
  64.      return result; 
  65.     } 
  66.     return new LinkedHashMap<>(0); 
  67.    } 
  68.    else { 
  69.     Map<String, String[]> parameterMap = webRequest.getParameterMap(); 
  70.     Map<String, String> result = CollectionUtils.newLinkedHashMap(parameterMap.size()); 
  71.     parameterMap.forEach((keyvalues) -> { 
  72.      if (values.length > 0) { 
  73.       result.put(keyvalues[0]); 
  74.      } 
  75.     }); 
  76.     return result; 
  77.    } 
  78.   } 
  79.  } 
  80.  

supportsParameter:參數(shù)類型是 Map,并且使用了 @RequestParam 注解,并且 @RequestParam 注解中沒有配置 name 屬性,就可以使用該參數(shù)解析器。

resolveArgument:具體解析分為兩種情況:MultiValueMap 和其他 Map,前者中又分三種情況:MultipartFile、Part 或者其他普通請(qǐng)求,前兩者可以處理文件上傳,第三個(gè)就是普通參數(shù)。如果是普通 Map,則直接獲取到原始請(qǐng)求參數(shù)放到一個(gè) Map 集合中返回即可。

4.小結(jié)

前面和大家聊的都是幾種簡(jiǎn)單的情況,還有復(fù)雜的如 PathVariableMethodArgumentResolver 和 RequestParamMethodArgumentResolver 松哥以后再和大家詳細(xì)聊。同時(shí)還有一個(gè)問題就是這些參數(shù)解析器具體是在哪里調(diào)用的,這個(gè)也會(huì)在松哥近期的 SpringMVC 源碼解析系列文章中和大家分享,好啦,今天周末,就這點(diǎn)簡(jiǎn)單的小知識(shí)祝大家周末愉快~

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

 

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

2022-07-11 10:37:41

MapPart集合

2022-05-11 10:45:21

SpringMVC框架Map

2025-03-13 07:33:46

Spring項(xiàng)目開發(fā)

2024-02-22 08:06:45

JSON策略解析器

2013-01-14 11:40:50

IBMdW

2023-11-01 08:01:04

SpringWeb容器

2025-03-10 01:00:00

Spring參數(shù)解析器

2022-01-06 06:23:49

Swagger參數(shù)解析器

2021-03-18 10:56:59

SpringMVC參數(shù)解析器

2011-08-09 17:16:56

CoreAnimati動(dòng)畫

2022-09-23 07:33:04

Springzookeeper配置

2021-11-23 15:06:42

Kubernetes 運(yùn)維開源

2023-10-11 07:57:23

springboot微服務(wù)

2010-07-22 09:25:21

Symbian開發(fā)

2014-05-06 09:27:54

2013-06-27 11:10:01

iOS開發(fā)自定義UISlider

2023-06-06 08:01:18

自定義接口響應(yīng)

2014-12-10 10:37:45

Android自定義布局

2009-09-13 18:58:07

自定義LINQ提供器

2025-03-05 10:49:32

點(diǎn)贊
收藏

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

韩国精品一区二区三区六区色诱| 欧美激情视频网址| 中文字幕22页| 污污影院在线观看| 99久久婷婷国产| 日本精品久久久久影院| 午夜激情福利电影| 久久丝袜视频| 欧美伦理视频网站| 午夜免费福利小电影| 大地资源中文在线观看免费版| 韩国一区二区在线观看| 68精品国产免费久久久久久婷婷| 少妇一级黄色片| 爱高潮www亚洲精品| 欧美影院一区二区三区| 日韩 欧美 视频| 波多野结衣在线网站| 丁香一区二区三区| 国产伦精品免费视频| 国产精品白浆一区二小说| 三区四区不卡| 国产婷婷成人久久av免费高清| 在线观看免费视频高清游戏推荐| av电影院在线看| 综合久久久久久| 日韩.欧美.亚洲| 日本精品久久久久久| 激情成人综合网| 国产成人精品av在线| 国产精品99精品无码视| 91精品一区国产高清在线gif| 日韩精品免费在线| 亚洲精品乱码久久久久久9色| 深夜视频一区二区| 狠狠色狠狠色综合日日五| www.一区二区.com| 黄色精品免费看| 中文字幕免费不卡| 欧美精品一区二区视频| 狠狠综合久久av一区二区| 精品综合久久久久久8888| 日韩av日韩在线观看| www日韩精品| 亚洲国产日韩欧美一区二区三区| 久久视频免费观看| 国产又粗又猛又爽又黄的视频四季 | 亚洲欧美偷拍一区| 国产亚洲一区在线| 久久人人97超碰精品888| 一区二区在线观看免费视频| 色琪琪久久se色| 中文一区二区视频| 欧美成人另类视频| 日韩欧美中字| 日日骚av一区| 亚洲女人久久久| 999国产精品永久免费视频app| 一本色道久久88亚洲综合88| 精品无码一区二区三区 | 欧美xxxx在线观看| 国产高潮失禁喷水爽到抽搐| 哺乳挤奶一区二区三区免费看| 日韩欧美国产综合一区| 亚洲精品乱码久久久久久9色| 清纯唯美激情亚洲| 亚洲第一精品夜夜躁人人躁| 蜜臀aⅴ国产精品久久久国产老师| 亚洲午夜免费| 亚洲成av人乱码色午夜| 久久偷拍免费视频| 九色精品91| 中文字幕日韩视频| 精品人妻伦九区久久aaa片| 欧美影院一区| 国内外成人免费激情在线视频| 久久久午夜影院| 久久在线精品| 国产欧美亚洲视频| 精品黑人一区二区三区在线观看 | 97久草视频| 视频一区 中文字幕| 久久先锋影音av鲁色资源网| 午夜精品电影在线观看| a级片国产精品自在拍在线播放| 一区二区三区成人| 成人av一级片| 日韩欧美三区| 亚洲第一精品自拍| 四季av中文字幕| 国产精品vip| 日本中文字幕成人| 国产精品欧美激情在线| 成人在线视频首页| 日韩欧美一区二区在线观看| av网址在线| 欧美性生交xxxxx久久久| 污版视频在线观看| 国产伦精品一区二区三区免费优势| 亚洲人成电影网站| 草视频在线观看| 天堂蜜桃一区二区三区| 99re视频| 国产youjizz在线| 一区二区欧美在线观看| 久久精品网站视频| 深夜福利一区| 国产一区二区三区高清在线观看| 黄色一级片在线| 日本亚洲一区二区| 国产一区再线| h片在线免费观看| 91黄色小视频| 免费黄色三级网站| 亚洲最新色图| 国产精品一二三视频| 少妇精品高潮欲妇又嫩中文字幕 | 婷婷视频在线播放| 亚洲美女尤物影院| 精品久久久久av影院 | 天堂中文在线资| 亚洲欧美偷拍三级| 美女网站免费观看视频| 加勒比久久高清| 成年人精品视频| 亚洲图片小说视频| 久久久国产综合精品女国产盗摄| 99国产精品白浆在线观看免费| 久久久精品一区二区毛片免费看| 亚洲精品自在久久| 日本熟女一区二区| 加勒比av一区二区| 亚洲国产欧美不卡在线观看| 亚洲天堂av在线| 亚洲第一精品电影| 日本a在线观看| 国产成都精品91一区二区三| 一本一道久久久a久久久精品91 | 国产欧美一区二区三区在线看| 全部免费毛片在线播放网站| 亚洲图片欧美综合| 中文字幕亚洲日本| 亚洲五月综合| 成人免费观看a| 在线看av的网址| 欧美午夜影院一区| 国产三级在线观看完整版| 羞羞答答国产精品www一本| 九色一区二区| 中文字幕影音在线| 亚洲日韩中文字幕| www.久久视频| 中文字幕国产精品一区二区| 精品少妇无遮挡毛片| 精品一区二区三区在线| 国产精品吊钟奶在线| 国产大片在线免费观看| 欧美天堂亚洲电影院在线播放| 日韩视频在线观看免费视频| 蜜臀av亚洲一区中文字幕| 亚洲国产欧洲综合997久久| abab456成人免费网址| 中文在线资源观看视频网站免费不卡 | 福利片在线观看| 欧美丝袜第三区| 91高清免费看| 国产iv一区二区三区| 国产高清av在线播放| 里番精品3d一二三区| 欧洲精品毛片网站| 98在线视频| 欧美一区二区三区免费观看视频 | 色噜噜狠狠成人网p站| 一级片手机在线观看| 久久精品二区亚洲w码| 黄色录像特级片| 久久久精品国产**网站| 欧美洲成人男女午夜视频| 成人影视在线播放| 337p亚洲精品色噜噜噜| 久久久久无码国产精品| av成人免费在线观看| 男女啪啪网站视频| 欧美激情国产在线| av蓝导航精品导航| 欧美日韩美女| 久久香蕉频线观| 日韩在线一区二区三区四区| 色悠悠久久综合| 老熟妇高潮一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 国产综合免费视频| 亚洲一区欧美| 久久精品日韩| 成人噜噜噜噜| 国产成人av网址| 日本h片在线观看| 亚洲一区999| 午夜久久久久久噜噜噜噜| 色噜噜狠狠色综合中国| 久久综合成人网| 国产精品网曝门| 欧美一级片黄色| 精品一区精品二区高清| 欧美在线观看成人| 91精品国产91久久久久久密臀| 久久久一本精品99久久精品| 国产免费av国片精品草莓男男 | 国产精品第一| 97精品久久久中文字幕免费| 秋霞a级毛片在线看| 日韩av有码在线| 97视频免费在线| 色综合婷婷久久| 精品无码免费视频| 中文字幕一区二区三区乱码在线 | 免费看污黄网站| 日韩网站在线| 日韩视频 中文字幕| 日韩综合精品| 日本一区高清在线视频| 黄色网一区二区| 亚洲最大av网| 亚州精品国产| 国产精品三级网站| 欧美性suv| 欧美在线观看网址综合| 久久五月精品中文字幕| 久久艳片www.17c.com| 成人性生交大片免费看午夜| 日韩精品一区二区视频| 男人的天堂a在线| 日韩区在线观看| 国产精品无码白浆高潮| 欧美日韩精品一区二区三区四区 | 亚洲福利影片在线| 国内精品久久久久久久久久| 欧美精品色一区二区三区| 欧美成人一区二区视频| 色综合天天综合网天天狠天天| 国产无遮挡裸体免费视频| 亚洲综合色丁香婷婷六月图片| 成人在线观看免费完整| 亚洲三级免费电影| 国产午夜精品理论片| 中文字幕亚洲欧美在线不卡| 四虎国产成人精品免费一女五男| 国产三级三级三级精品8ⅰ区| 西西444www无码大胆| 国产亚洲一区二区三区四区| a级片在线观看| 国产喷白浆一区二区三区| 国产美女免费网站| 欧美精彩视频一区二区三区| 亚洲天堂岛国片| 国产精品伦理在线| 91禁男男在线观看| 日韩一区有码在线| 天天干中文字幕| 天天影视涩香欲综合网| 狠狠躁夜夜躁人人爽天天高潮| 欧美日韩国产一区二区| www.色国产| 欧美日韩一区在线观看| 91在线观看喷潮| 精品国产一区二区在线观看| 手机av免费在线观看| 亚洲天堂久久av| 黄色网址在线免费观看| 欧美第一黄网免费网站| 888av在线视频| 国产va免费精品高清在线| 成人a在线观看高清电影| 91久久久在线| 国产精品白丝一区二区三区| 久久综合福利| 久久精品国产99久久| 4444在线观看| 先锋影音国产一区| 少妇一级淫免费放| 大黑人交xxx极品hd| 亚洲av综合一区| 亚洲色图.com| 1级黄色大片儿| 欧洲精品一区二区三区在线观看| 亚洲中文字幕一区二区| 精品国产乱码久久久久久免费| 蜜桃视频在线入口www| 精品国产拍在线观看| 九色91在线| 国产精品www色诱视频| 国产剧情一区二区在线观看| 精品综合久久| 色综合咪咪久久网| 无码精品a∨在线观看中文| 蜜臀av一区二区在线免费观看| 91精产国品一二三| 国产女人水真多18毛片18精品视频| 2021亚洲天堂| 在线免费一区三区| 亚洲精品喷潮一区二区三区| 这里只有精品丝袜| 欧美调教sm| 91午夜理伦私人影院| 国产一区二区精品福利地址| 国产在线视频在线| 奇米777欧美一区二区| 中国xxxx性xxxx产国| 亚洲欧洲av在线| 国产成人在线免费观看视频| 欧美一级日韩不卡播放免费| 美女做暖暖视频免费在线观看全部网址91 | 91超碰caoporn97人人| crdy在线观看欧美| 欧洲一区二区在线观看| 好看的av在线不卡观看| 加勒比av中文字幕| 久久久久久久免费视频了| 精品无码久久久久| 91精品国产免费| av资源在线观看免费高清| 992tv在线成人免费观看| 久久中文字幕一区二区| 亚州欧美一区三区三区在线| 野花国产精品入口| 午夜影院福利社| 亚洲精品国产无套在线观| 一区二区三区www污污污网站| 亚洲欧美制服丝袜| 在线手机中文字幕| 国产日韩欧美二区| 国内激情久久| 91精产国品一二三| 亚洲黄色免费网站| 99视频免费看| 欧美精品在线播放| 97精品资源在线观看| 亚洲精品人成| 蜜臀av一区二区在线免费观看 | 国产探花在线精品| 日日摸日日碰夜夜爽av| 99在线精品视频| 日本中文字幕免费| 亚洲成人黄色网| 多野结衣av一区| 久久精品综合一区| 亚洲一区久久| 亚洲做受高潮无遮挡| 一本大道av一区二区在线播放| 日av在线播放| 日本中文字幕成人| 精品视频久久| 天堂av在线8| 亚洲精品网站在线观看| 国产高清第一页| 欧美日产国产成人免费图片| 136导航精品福利| 精品无码一区二区三区在线| 91在线视频官网| 丰满人妻老熟妇伦人精品| 亚洲性无码av在线| 免费一级欧美在线观看视频| 国产av不卡一区二区| 国产精品一区二区三区乱码| 毛片aaaaa| 亚洲精品一区在线观看香蕉| 精品91久久| 色爱区成人综合网| 国产在线麻豆精品观看| 久久久国产精华液| 日韩国产精品亚洲а∨天堂免| 日韩一区二区三区在线免费观看| 亚洲成人一区二区三区| 狠狠狠色丁香婷婷综合激情| 国产精品第108页| 亚洲人永久免费| 婷婷久久免费视频| 全黄性性激高免费视频| 久久精品夜色噜噜亚洲aⅴ| 中文字幕一区二区三区免费看| 久久精品小视频| xvideos.蜜桃一区二区| 日本熟妇人妻中出| 一区二区国产视频| 欧美黄色小说| 亚洲一区二区三区sesese| 日韩一区二区免费看| 欧美黄色高清视频| 欧美tk—视频vk| 欧美色999| 国产成人一区二区三区别| 26uuu色噜噜精品一区二区| 91tv国产成人福利| 97精品在线视频| 99久久婷婷| 欧美性xxxx图片| 日韩一区二区在线观看视频| 亚洲播播91| 国产美女在线一区| 国产精品久久久久三级|