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

springboot 實現攔截器的 3 種方式介紹及異步執行的思考

開發 前端
spring 對于頁面的響應也許和我們想的有些不一樣,并不是直接獲取同步結果。Aspect 的形式在很多框架中都會使用,不過這里會發現無法獲取異步的執行結果,存在一定問題。

[[411912]]

springboot 攔截器

實際項目中,我們經常需要輸出請求參數,響應結果,方法耗時,統一的權限校驗等。

本文首先為大家介紹 HTTP 請求中三種常見的攔截實現,并且比較一下其中的差異。

(1)基于 Aspect 的攔截器

(2)基于 HandlerInterceptor 的攔截器

(3)基于 ResponseBodyAdvice 的攔截器

springboot 實現攔截器的 3 種方式介紹及異步執行的思考

springboot 入門案例

為了便于大家學習,我們首先從最基本的 springboot 例子講起。

maven 引入

引入必須的 jar 包。

  1. <parent> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-parent</artifactId> 
  4.     <version>1.5.9.RELEASE</version> 
  5. </parent> 
  6.  
  7. <dependencies> 
  8.     <dependency> 
  9.         <groupId>org.springframework.boot</groupId> 
  10.         <artifactId>spring-boot-starter-web</artifactId> 
  11.     </dependency> 
  12.     <dependency> 
  13.         <groupId>org.aspectj</groupId> 
  14.         <artifactId>aspectjrt</artifactId> 
  15.         <version>1.8.10</version> 
  16.     </dependency> 
  17.     <dependency> 
  18.         <groupId>org.aspectj</groupId> 
  19.         <artifactId>aspectjweaver</artifactId> 
  20.         <version>1.8.10</version> 
  21.     </dependency> 
  22. </dependencies> 
  23. <!-- Package as an executable jar --> 
  24. <build> 
  25.     <plugins> 
  26.         <plugin> 
  27.             <groupId>org.springframework.boot</groupId> 
  28.             <artifactId>spring-boot-maven-plugin</artifactId> 
  29.         </plugin> 
  30.     </plugins> 
  31. </build> 

啟動類

實現最簡單的啟動類。

  1. @SpringBootApplication 
  2. public class Application { 
  3.  
  4.     public static void main(String[] args) { 
  5.         SpringApplication.run(Application.class, args); 
  6.     } 
  7.  

定義 Controller

為了演示方便,我們首先實現一個簡單的 controller。

  1. @RestController 
  2. public class IndexController { 
  3.  
  4.     @RequestMapping("/index"
  5.     public AsyncResp index() { 
  6.         AsyncResp asyncResp = new AsyncResp(); 
  7.         asyncResp.setResult("ok"); 
  8.         asyncResp.setRespCode("00"); 
  9.         asyncResp.setRespDesc("成功"); 
  10.  
  11.         System.out.println("IndexController#index:" + asyncResp); 
  12.         return asyncResp; 
  13.     } 
  14.  

其中 AsyncResp 的定義如下:

  1. public class AsyncResp { 
  2.  
  3.     private String respCode; 
  4.  
  5.     private String respDesc; 
  6.  
  7.     private String result; 
  8.  
  9.  
  10.     // getter & setter & toString() 

攔截器定義

基于 Aspect

  1. import org.aspectj.lang.ProceedingJoinPoint; 
  2. import org.aspectj.lang.annotation.Around; 
  3. import org.aspectj.lang.annotation.Aspect; 
  4. import org.aspectj.lang.annotation.Pointcut; 
  5. import org.slf4j.Logger; 
  6. import org.slf4j.LoggerFactory; 
  7. import org.springframework.context.annotation.EnableAspectJAutoProxy; 
  8. import org.springframework.stereotype.Component; 
  9.  
  10. import java.util.Arrays; 
  11.  
  12. /** 
  13.  * 
  14.  * @author binbin.hou 
  15.  * @since 1.0.0 
  16.  */ 
  17. @Aspect 
  18. @Component 
  19. @EnableAspectJAutoProxy 
  20. public class AspectLogInterceptor { 
  21.  
  22.     /** 
  23.      * 日志實例 
  24.      * @since 1.0.0 
  25.      */ 
  26.     private static final Logger LOG = LoggerFactory.getLogger(AspectLogInterceptor.class); 
  27.  
  28.     /** 
  29.      * 攔截 controller 下所有的 public方法 
  30.      */ 
  31.     @Pointcut("execution(public * com.github.houbb.springboot.learn.aspect.controller..*(..))"
  32.     public void pointCut() { 
  33.         // 
  34.     } 
  35.  
  36.     /** 
  37.      * 攔截處理 
  38.      * 
  39.      * @param point point 信息 
  40.      * @return result 
  41.      * @throws Throwable if any 
  42.      */ 
  43.     @Around("pointCut()"
  44.     public Object around(ProceedingJoinPoint point) throws Throwable { 
  45.         try { 
  46.             //1. 設置 MDC 
  47.  
  48.             // 獲取當前攔截的方法簽名 
  49.             String signatureShortStr = point.getSignature().toShortString(); 
  50.             //2. 打印入參信息 
  51.             Object[] args = point.getArgs(); 
  52.             LOG.info("{} 參數: {}", signatureShortStr, Arrays.toString(args)); 
  53.  
  54.             //3. 打印結果 
  55.             Object result = point.proceed(); 
  56.             LOG.info("{} 結果: {}", signatureShortStr, result); 
  57.             return result; 
  58.         } finally { 
  59.             // 移除 mdc 
  60.         } 
  61.     } 
  62.  

這種實現的優點是比較通用,可以結合注解實現更加靈活強大的功能。

是個人非常喜歡的一種方式。

主要用途:

(1)日志的出參/入參

(2)統一設置 TraceId

(3)方法的調用耗時統計

基于 HandlerInterceptor

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3. import org.springframework.stereotype.Component; 
  4. import org.springframework.web.servlet.HandlerInterceptor; 
  5. import org.springframework.web.servlet.ModelAndView; 
  6.  
  7. import javax.servlet.DispatcherType; 
  8. import javax.servlet.http.HttpServletRequest; 
  9. import javax.servlet.http.HttpServletResponse; 
  10.  
  11. /** 
  12.  * @author binbin.hou 
  13.  * @since 1.0.0 
  14.  */ 
  15. @Component 
  16. public class LogHandlerInterceptor implements HandlerInterceptor { 
  17.  
  18.     private Logger logger = LoggerFactory.getLogger(LogHandlerInterceptor.class); 
  19.  
  20.     @Override 
  21.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
  22.         // 統一的權限校驗、路由等 
  23.         logger.info("LogHandlerInterceptor#preHandle 請求地址:{}", request.getRequestURI()); 
  24.  
  25.         if (request.getDispatcherType().equals(DispatcherType.ASYNC)) { 
  26.             return true
  27.         } 
  28.  
  29.         return true
  30.     } 
  31.  
  32.     @Override 
  33.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
  34.         logger.info("LogHandlerInterceptor#postHandle 調用"); 
  35.     } 
  36.  
  37.     @Override 
  38.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
  39.  
  40.     } 
  41.  

然后需要指定對應的 url 和攔截器之間的關系才會生效:

  1. import com.github.houbb.springboot.learn.aspect.aspect.LogHandlerInterceptor; 
  2. import org.springframework.beans.factory.annotation.Autowired; 
  3. import org.springframework.context.annotation.Configuration; 
  4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
  6.  
  7. /** 
  8.  * spring mvc 配置 
  9.  * @since 1.0.0 
  10.  */ 
  11. @Configuration 
  12. public class SpringMvcConfig extends WebMvcConfigurerAdapter { 
  13.  
  14.     @Autowired 
  15.     private LogHandlerInterceptor logHandlerInterceptor; 
  16.  
  17.     @Override 
  18.     public void addInterceptors(InterceptorRegistry registry) { 
  19.         registry.addInterceptor(logHandlerInterceptor) 
  20.                 .addPathPatterns("/**"
  21.                 .excludePathPatterns("/version"); 
  22.         super.addInterceptors(registry); 
  23.     } 
  24.  

這種方式的優點就是可以根據 url 靈活指定不同的攔截器。

缺點是主要用于 Controller 層。

基于 ResponseBodyAdvice

此接口有beforeBodyWrite方法,參數body是響應對象response中的響應體,那么我們就可以用此方法來對響應體做一些統一的操作。

比如加密,簽名等。

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3. import org.springframework.core.MethodParameter; 
  4. import org.springframework.http.MediaType; 
  5. import org.springframework.http.converter.HttpMessageConverter; 
  6. import org.springframework.http.server.ServerHttpRequest; 
  7. import org.springframework.http.server.ServerHttpResponse; 
  8. import org.springframework.http.server.ServletServerHttpRequest; 
  9. import org.springframework.web.bind.annotation.ControllerAdvice; 
  10. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; 
  11.  
  12. import javax.servlet.http.HttpServletRequest; 
  13.  
  14. /** 
  15.  * @author binbin.hou 
  16.  * @since 1.0.0 
  17.  */ 
  18. @ControllerAdvice 
  19. public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> { 
  20.  
  21.     /** 
  22.      * 日志實例 
  23.      * @since 1.0.0 
  24.      */ 
  25.     private static final Logger LOG = LoggerFactory.getLogger(MyResponseBodyAdvice.class); 
  26.  
  27.     @Override 
  28.     public boolean supports(MethodParameter methodParameter, Class aClass) { 
  29.         //這個地方如果返回false, 不會執行 beforeBodyWrite 方法 
  30.         return true
  31.     } 
  32.  
  33.     @Override 
  34.     public Object beforeBodyWrite(Object resp, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { 
  35.         String uri = serverHttpRequest.getURI().getPath(); 
  36.         LOG.info("MyResponseBodyAdvice#beforeBodyWrite 請求地址:{}", uri); 
  37.  
  38.         ServletServerHttpRequest servletServerHttpRequest = (ServletServerHttpRequest) serverHttpRequest; 
  39.         HttpServletRequest servletRequest = servletServerHttpRequest.getServletRequest(); 
  40.  
  41.         // 可以做統一的攔截器處理 
  42.  
  43.         // 可以對結果做動態修改等 
  44.         LOG.info("MyResponseBodyAdvice#beforeBodyWrite 響應結果:{}", resp); 
  45.         return resp; 
  46.     } 
  47.  

測試

我們啟動應用,頁面訪問:

http://localhost:18080/index

頁面響應:

  1. {"respCode":"00","respDesc":"成功","result":"ok"

后端日志:

  1. c.g.h.s.l.a.a.LogHandlerInterceptor      : LogHandlerInterceptor#preHandle 請求地址:/index 
  2. c.g.h.s.l.a.aspect.AspectLogInterceptor  : IndexController.index() 參數: [] 
  3. IndexController#index:AsyncResp{respCode='00', respDesc='成功', result='ok'
  4. c.g.h.s.l.a.aspect.AspectLogInterceptor  : IndexController.index() 結果: AsyncResp{respCode='00', respDesc='成功', result='ok'
  5. c.g.h.s.l.a.aspect.MyResponseBodyAdvice  : MyResponseBodyAdvice#beforeBodyWrite 請求地址:/index 
  6. c.g.h.s.l.a.aspect.MyResponseBodyAdvice  : MyResponseBodyAdvice#beforeBodyWrite 響應結果:AsyncResp{respCode='00', respDesc='成功', result='ok'
  7. c.g.h.s.l.a.a.LogHandlerInterceptor      : LogHandlerInterceptor#postHandle 調用 

這里執行的先后順序也比較明確,此處不再贅述。

異步執行

當然,如果只是上面這些內容,并不是本篇文章的重點。

接下來,我們一起來看下,如果引入了異步執行會怎么樣。

定義異步線程池

springboot 中定義異步線程池,非常簡單。

  1. import org.springframework.context.annotation.Bean; 
  2. import org.springframework.context.annotation.Configuration; 
  3. import org.springframework.core.task.AsyncTaskExecutor; 
  4. import org.springframework.scheduling.annotation.EnableAsync; 
  5. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 
  6.  
  7. /** 
  8.  * 請求異步處理配置 
  9.  * 
  10.  * @author binbin.hou 
  11.  */ 
  12. @Configuration 
  13. @EnableAsync 
  14. public class SpringAsyncConfig { 
  15.  
  16.     @Bean(name = "asyncPoolTaskExecutor"
  17.     public AsyncTaskExecutor taskExecutor() { 
  18.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  19.         executor.setMaxPoolSize(10); 
  20.         executor.setQueueCapacity(10); 
  21.         executor.setCorePoolSize(10); 
  22.         executor.setWaitForTasksToCompleteOnShutdown(true); 
  23.         return executor; 
  24.     } 
  25.  

異步執行的 Controller

  1. @RestController 
  2. public class MyAsyncController extends BaseAsyncController<String> { 
  3.  
  4.     @Override 
  5.     protected String process(HttpServletRequest request) { 
  6.         return "ok"
  7.     } 
  8.  
  9.     @RequestMapping("/async"
  10.     public AsyncResp hello(HttpServletRequest request) { 
  11.         AsyncResp resp = super.execute(request); 
  12.  
  13.         System.out.println("Controller#async 結果:" + resp); 
  14.         return resp; 
  15.     } 
  16.  

 其中 BaseAsyncController 的實現如下:

  1. @RestController 
  2. public abstract class BaseAsyncController<T> { 
  3.  
  4.     protected abstract T process(HttpServletRequest request); 
  5.  
  6.     @Autowired 
  7.     private AsyncTaskExecutor taskExecutor; 
  8.  
  9.     protected AsyncResp execute(HttpServletRequest request) { 
  10.         // 異步響應結果 
  11.         AsyncResp resp = new AsyncResp(); 
  12.         try { 
  13.             taskExecutor.execute(new Runnable() { 
  14.                 @Override 
  15.                 public void run() { 
  16.                     try { 
  17.                         T result = process(request); 
  18.  
  19.                         resp.setRespCode("00"); 
  20.                         resp.setRespDesc("成功"); 
  21.                         resp.setResult(result.toString()); 
  22.  
  23.                     } catch (Exception exception) { 
  24.                         resp.setRespCode("98"); 
  25.                         resp.setRespDesc("任務異常"); 
  26.                     } 
  27.                 } 
  28.             }); 
  29.         } catch (TaskRejectedException e) { 
  30.             resp.setRespCode("99"); 
  31.             resp.setRespDesc("任務拒絕"); 
  32.         } 
  33.  
  34.         return resp; 
  35.     } 
  36.  

 execute 的實現也比較簡單:

(1)主線程創建一個 AsyncResp,用于返回。

(2)線程池異步執行具體的子類方法,并且設置對應的值。

思考

接下來,問大家一個問題。

如果我們請求

http://localhost:18080/async,那么:

(1)頁面得到的返回值是什么?

(2)Aspect 日志輸出的返回值是?

(3)ResponseBodyAdvice 日志輸出的返回值是什么?

你可以在這里稍微停一下,記錄下你的答案。

測試

我們頁面請求

http://localhost:18080/async。

頁面響應如下:

  1. {"respCode":"00","respDesc":"成功","result":"ok"

后端的日志:

  1. c.g.h.s.l.a.a.LogHandlerInterceptor      : LogHandlerInterceptor#preHandle 請求地址:/async 
  2. c.g.h.s.l.a.aspect.AspectLogInterceptor  : MyAsyncController.hello(..) 參數: [org.apache.catalina.connector.RequestFacade@7e931750] 
  3. Controller#async 結果:AsyncResp{respCode='null', respDesc='null', result='null'
  4. c.g.h.s.l.a.aspect.AspectLogInterceptor  : MyAsyncController.hello(..) 結果: AsyncResp{respCode='null', respDesc='null', result='null'
  5. c.g.h.s.l.a.aspect.MyResponseBodyAdvice  : MyResponseBodyAdvice#beforeBodyWrite 請求地址:/async 
  6. c.g.h.s.l.a.aspect.MyResponseBodyAdvice  : MyResponseBodyAdvice#beforeBodyWrite 響應結果:AsyncResp{respCode='00', respDesc='成功', result='ok'
  7. c.g.h.s.l.a.a.LogHandlerInterceptor      : LogHandlerInterceptor#postHandle 調用 

對比一下,可以發現我們上面問題的答案:

(1)頁面得到的返回值是什么?

  1. {"respCode":"00","respDesc":"成功","result":"ok"

可以獲取到異步執行完成的結果。

(2)Aspect 日志輸出的返回值是?

  1. AsyncResp{respCode='null', respDesc='null', result='null'

無法獲取異步結果。

(3)ResponseBodyAdvice 日志輸出的返回值是什么?

  1. AsyncResp{respCode='00', respDesc='成功', result='ok'

可以獲取到異步執行完成的結果。

反思

可以發現,spring 對于頁面的響應也許和我們想的有些不一樣,并不是直接獲取同步結果。

寫到這里,發現自己對于 mvc 的理解一直只是停留在表面,沒有真正理解整個流程。

Aspect 的形式在很多框架中都會使用,不過這里會發現無法獲取異步的執行結果,存在一定問題。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-03-25 17:55:30

SpringBoot攔截器Java

2025-05-09 08:20:50

2025-01-02 10:10:51

2009-06-24 16:00:00

2011-11-21 14:21:26

SpringMVCJava框架

2021-06-30 07:19:34

SpringBoot定時任務

2009-07-08 17:02:11

JDK實現調用攔截器

2025-08-01 07:07:18

2009-06-25 15:59:21

Struts2教程攔截器

2025-03-26 00:35:25

2022-07-01 08:00:44

異步編程FutureTask

2009-02-04 14:45:06

2009-06-04 08:01:25

Struts2攔截器原理

2024-05-06 00:00:00

C#工具代碼

2016-08-19 08:50:12

SparkWordCountreduceByKey

2025-07-15 02:00:00

2024-05-13 09:32:06

攔截器HTTP中間件

2025-10-15 02:15:00

SpringBoot項目開發

2023-09-15 11:26:16

2009-09-27 17:37:32

Hibernate攔截
點贊
收藏

51CTO技術棧公眾號

欧美一卡二卡在线观看| 中文字幕一区二| 国产91精品久久久久久久| 波多野结衣a v在线| 97精品国产综合久久久动漫日韩 | 性欧美一区二区| 成人免费91| 动漫精品一区二区| 亚洲一区在线免费| 噜噜噜久久,亚洲精品国产品| 99成人在线| 视频在线一区二区| 亚洲男人在线天堂| 国产精品3区| 一本色道亚洲精品aⅴ| 99亚洲精品视频| 日本一本草久在线中文| 国产一区二区美女| 国产精品18久久久久久首页狼| 神马午夜精品91| 国产日产精品_国产精品毛片| 欧美一区二区性放荡片| 久久久精品在线视频| 制服丝袜在线播放| 中文字幕精品一区二区精品绿巨人| 超碰97网站| 亚洲一区中文字幕永久在线| 日韩视频一区| 九九热这里只有在线精品视| 人妻无码一区二区三区免费| 日韩aaa久久蜜桃av| 337p亚洲精品色噜噜| 国产精品69页| 九色porny视频在线观看| 一区二区三区在线影院| 午夜精品短视频| 你懂的免费在线观看| 国产91丝袜在线播放九色| 国产欧美一区二区| 午夜视频网站在线观看| 亚洲欧美日本日韩| 2019av中文字幕| 久久精品视频8| 亚洲综合专区| 久久九九有精品国产23| 国产无遮挡在线观看| 九九久久婷婷| 亚洲人高潮女人毛茸茸| 国产在线观看无码免费视频| 91精品日本| 日韩三级视频在线观看| 男人添女人荫蒂国产| 国产日韩欧美中文在线| 欧美一区二区三区四区在线观看 | 在线播放 亚洲| 色三级在线观看| 国产精品久久久久久福利一牛影视 | 欧美国产精品专区| 日韩理论片在线观看| 黄色大片在线免费观看| 国产日韩欧美综合一区| 青青影院一区二区三区四区| 黄色在线播放| 国产精品亲子乱子伦xxxx裸| 亚洲一区二区在| 老司机免费在线视频| 亚洲欧美一区二区三区国产精品| 天天干天天操天天干天天操| 99视频免费在线观看| 一区二区在线观看视频在线观看| 久久综合亚洲精品| 懂色av一区| 精品日韩美女的视频高清| 国产精品无码一区二区在线| 国模套图日韩精品一区二区| 欧美午夜不卡在线观看免费| 国产成人美女视频| 一区二区网站| 亚洲欧美日韩国产中文| 久久久久久久久福利| 99久久夜色精品国产亚洲狼 | 卡通动漫亚洲综合| 国产精品成人一区二区网站软件| 97国产精品久久| 波多野结衣在线观看视频| 久久国产精品99久久久久久老狼 | 97精品国产97久久久久久免费 | 狠狠干一区二区| 大片免费播放在线视频| 亚洲日本乱码在线观看| 少妇人妻在线视频| 99久久亚洲国产日韩美女| 日韩亚洲国产中文字幕欧美| 91精品国产自产| 欧美色蜜桃97| 国自产精品手机在线观看视频| 一二三区免费视频| 国产精品一区二区久久不卡| 欧洲精品码一区二区三区免费看| 麻豆影院在线| 欧美日韩中国免费专区在线看| xx欧美撒尿嘘撒尿xx| 综合激情五月婷婷| 在线观看视频亚洲| 国产性xxxx高清| 蜜臀av性久久久久蜜臀aⅴ | 日韩欧美视频| 午夜精品99久久免费| 97人妻精品一区二区三区| 91玉足脚交白嫩脚丫在线播放| 制服国产精品| 性感美女一区二区在线观看| 精品精品欲导航| 五月天免费网站| 午夜一区在线| 国产精品一区二区欧美黑人喷潮水| аⅴ资源新版在线天堂| 精品国产精品三级精品av网址| 国产传媒免费观看| 国产亚洲一区| 8050国产精品久久久久久| 国产精品无码在线播放| 国产亚洲污的网站| 男人和女人啪啪网站| 在这里有精品| 精品国产一区久久久| 天堂网视频在线| 成人高清在线视频| 成人高清dvd| 国产精品一区二区三区四区在线观看| 国产亚洲激情在线| 欧美一级片免费在线观看| 国产xxx精品视频大全| 最新中文字幕久久| 日韩黄色在线| 色婷婷av一区二区三区久久| 天天干天天干天天操| 波多野结衣亚洲一区| 国产精品av免费观看| 日韩伦理一区二区| 日韩视频免费看| 91美女精品网站| 国产精品久久久久影视| 蜜桃免费在线视频| jlzzjlzz亚洲女人| 国产精品偷伦视频免费观看国产| 成av人电影在线观看| 欧美亚洲禁片免费| 公肉吊粗大爽色翁浪妇视频| 水野朝阳av一区二区三区| 久久精品国产第一区二区三区最新章节| 9lporm自拍视频区在线| 亚洲精品电影网站| 国产精品999在线观看| www成人在线观看| 99久久国产宗和精品1上映| 欧美人与牛zoz0性行为| 国产精品久久久久久久久久久不卡| 国产中文在线视频| 欧美日韩一级视频| 成年人午夜剧场| 成人禁用看黄a在线| 无码中文字幕色专区| 日韩在线影视| 国产精品免费久久久| 日韩精品毛片| 日韩美女在线视频| 日韩三级小视频| 久久久99久久| 午夜不卡福利视频| 精品91在线| 欧洲精品一区色| 亚洲精品伊人| 欧美巨猛xxxx猛交黑人97人| 蜜臀久久精品久久久久| 欧美性xxxxx极品| jizzjizz日本少妇| 国产成人精品免费网站| 欧美日韩二三区| 久久国产精品成人免费观看的软件| 亚洲一区中文字幕在线观看| 成人影院在线视频| 伊人久久大香线蕉av一区二区| 国产免费黄色录像| 精品女同一区二区三区在线播放| 亚洲最大成人综合网| 国产米奇在线777精品观看| 黄页免费在线观看视频| 狠狠做六月爱婷婷综合aⅴ| 91美女片黄在线观| 亚洲欧美电影| 美女av一区二区| 日本v片在线免费观看| 欧美日韩免费视频| 国产欧美日韩另类| 中文字幕一区二区三区乱码在线| 亚洲啪av永久无码精品放毛片 | 国产精品国产自产拍高清av水多| 国产一区久久精品| 亚洲欧美一区二区三区四区| 国产精品乱码一区二区| 疯狂做受xxxx高潮欧美日本| 女同久久另类69精品国产 | 精品国产无码在线观看| 国产精品一区二区三区乱码| 日本一本二本在线观看| 综合一区在线| 天天人人精品| 日本在线中文字幕一区| 91嫩草国产在线观看| 日本少妇一区| 91禁外国网站| 少妇视频在线| 日韩三级影视基地| 高清中文字幕一区二区三区| 亚洲福利视频在线| av网站免费大全| 欧美色视频在线| 国产成人在线视频观看| 亚洲网友自拍偷拍| 国产精品久久久久久久精| 国产日产欧美一区| a毛片毛片av永久免费| 国产999精品久久久久久绿帽| 99re6在线观看| 久久av在线| 1024av视频| 亚洲清纯自拍| 日韩一区二区高清视频| 欧美在线国产| 性生活免费观看视频| 天天做天天爱天天综合网2021| 日本在线观看一区二区三区| 日韩精品导航| 久久国产手机看片| 国产在线播放精品| 国产中文一区二区| 国产精品x8x8一区二区| av免费观看久久| 日韩精品成人| 99九九视频| 91久久精品无嫩草影院| av成人午夜| 国产精品白丝av嫩草影院| 国产精品yjizz| 国产精品毛片视频| 精品国产乱码一区二区三区四区 | www.午夜色| 国产韩日影视精品| 国产91av视频在线观看| 婷婷激情图片久久| 一区中文字幕在线观看| 亚洲第一偷拍| 大陆av在线播放| av不卡免费看| 国产精品欧美激情在线观看| 久久免费黄色| 男操女免费网站| 精品系列免费在线观看| 91大神免费观看| 粉嫩av一区二区三区在线播放| 大乳护士喂奶hd| 91丨porny丨蝌蚪视频| 国产中年熟女高潮大集合| 国产亚洲一区二区三区四区| 永久免费观看片现看| 亚洲欧美日韩在线播放| 久久久精品视频在线| 五月激情综合色| 啪啪小视频网站| 欧美一级电影网站| 深夜福利视频网站| 亚洲天堂视频在线观看| 日本亚洲精品| 久久久久中文字幕| 欧美舌奴丨vk视频| 成人中文字幕在线观看| 红杏一区二区三区| 日韩欧美亚洲区| 欧美~级网站不卡| 国产超级av在线| 久久国产精品72免费观看| 黑人巨大猛交丰满少妇| 精品国产va久久久久久久| 姬川优奈aav一区二区| 波多野结衣理论片| 日韩一区二区电影| 亚洲三区在线播放| 久久精品国产精品亚洲| 第一福利在线视频| 国产欧美亚洲精品| 嫩草国产精品入口| 在线看成人av电影| 欧美日韩三级| 久久精品午夜福利| 国产裸体歌舞团一区二区| 国产呦小j女精品视频| 亚洲三级电影网站| 日本中文字幕在线观看视频| 日韩亚洲欧美一区| aaa在线免费观看| 性欧美办公室18xxxxhd| 亚洲欧美在线人成swag| 精品一区二区三区免费毛片| 亚洲综合五月| 第四色婷婷基地| 久久久影院官网| 精品在线视频免费观看| 欧美精品乱人伦久久久久久| 亚洲av毛片成人精品| 欧美日韩国产999| 亚洲精品第一| 天堂资源在线亚洲资源| 性高湖久久久久久久久| 日本少妇xxxx软件| 亚洲欧美一区二区在线观看| 亚洲欧美偷拍视频| 精品国产乱码久久久久久1区2区 | 在线观看毛片网站| 亚洲免费视频一区二区| 欧美理论片在线播放| 91久久国产婷婷一区二区| 精品亚洲成人| 日本三区在线观看| 久久午夜老司机| 久久久国产高清| 亚洲成人激情在线观看| 直接在线观看的三级网址| 成人免费网站在线| 色天天久久综合婷婷女18| 午夜dv内射一区二区| 91女厕偷拍女厕偷拍高清| 日韩av一二三区| 欧美tk—视频vk| 日本动漫同人动漫在线观看| 91在线国产电影| 欧美一区二区| 国产乱淫av麻豆国产免费| 日韩毛片精品高清免费| 亚洲视频在线观看免费视频| 色悠悠久久88| 日本电影久久久| 一级一片免费播放| 国产原创一区二区| 欧美三级 欧美一级| 精品裸体舞一区二区三区| 欧美另类tv| 久久人人爽爽人人爽人人片av| 在线综合视频| 日本黄色网址大全| 欧美最猛性xxxxx直播| 91在线导航| 亚洲aⅴ男人的天堂在线观看 | 国产永久免费视频| 久久综合久久八八| 成人激情自拍| 女人扒开屁股爽桶30分钟| 久久久电影一区二区三区| 久久久久精彩视频| 俺也去精品视频在线观看| 最新国产精品精品视频| 欧美啪啪免费视频| 国产三级精品三级| 国产日本精品视频| 国内外成人免费激情在线视频网站| 女一区二区三区| 中文字幕永久视频| 亚洲欧美日韩精品久久久久| 超碰在线播放97| 91成人在线播放| 久久理论电影| 91传媒理伦片在线观看| 精品久久中文字幕久久av| 福利小视频在线观看| 69堂成人精品视频免费| 中国女人久久久| 色偷偷www8888| 亚洲国产精品资源| 成人在线视频免费| 国内少妇毛片视频| 久久精品一区蜜桃臀影院| 国产乱淫av片免费| 91精品国产色综合| 欧美黄色录像片| 精品熟女一区二区三区| 精品污污网站免费看| 俺来也官网欧美久久精品| 日韩在线观看电影完整版高清免费| 国产一区二区三区四区五区美女| 国产精品999在线观看| 久久中文字幕视频| 国产伦精品一区二区三区千人斩| 精品亚洲视频在线| 欧美日韩国产专区| av网站大全在线| 日韩成人在线资源| 成人免费视频caoporn| 中文字幕av资源| 97在线视频一区| 综合激情在线|