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

這篇寫的太好了!Spring Boot + Redis 實現接口冪等性

存儲 存儲軟件 Redis
冪等性的概念是,任意多次執行所產生的影響都與一次執行產生的影響相同,按照這個含義,最終的解釋是對數據庫的影響只能是一次性的,不能重復處理。

[[351749]]

本文轉載自微信公眾號「小明菜市場」,可以通過以下二維碼關注。轉載本文請聯系小明菜市場公眾號。

介紹

冪等性的概念是,任意多次執行所產生的影響都與一次執行產生的影響相同,按照這個含義,最終的解釋是對數據庫的影響只能是一次性的,不能重復處理。手段如下

  • 數據庫建立唯一索引
  • token機制
  • 悲觀鎖或者是樂觀鎖
  • 先查詢后判斷

小小主要帶你們介紹Redis實現自動冪等性。其原理如下圖所示。

實現過程

引入 maven 依賴

  1. <dependency> 
  2.            <groupId>org.springframework.boot</groupId> 
  3.            <artifactId>spring-boot-starter-data-redis</artifactId> 
  4.        </dependency> 

spring 配置文件寫入

  1. server.port=8080 
  2. core.datasource.druid.enabled=true 
  3. core.datasource.druid.url=jdbc:mysql://192.168.1.225:3306/?useUnicode=true&characterEncoding=UTF-8 
  4. core.datasource.druid.username=root 
  5. core.datasource.druid.password
  6. core.redis.enabled=true 
  7. spring.redis.host=192.168.1.225 #本機的redis地址 
  8. spring.redis.port=16379 
  9. spring.redis.database=3 
  10. spring.redis.jedis.pool.max-active=10 
  11. spring.redis.jedis.pool.max-idle=10 
  12. spring.redis.jedis.pool.max-wait=5s 
  13. spring.redis.jedis.pool.min-idle=10 

引入 Redis

引入 Spring boot 中的redis相關的stater,后面需要用到 Spring Boot 封裝好的 RedisTemplate

  1. package cn.smallmartial.demo.utils; 
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired; 
  4. import org.springframework.data.redis.core.RedisTemplate; 
  5. import org.springframework.data.redis.core.ValueOperations; 
  6. import org.springframework.stereotype.Component; 
  7.  
  8. import java.io.Serializable
  9. import java.util.Objects; 
  10. import java.util.concurrent.TimeUnit; 
  11.  
  12. /** 
  13.  * @Author smallmartial 
  14.  * @Date 2020/4/16 
  15.  * @Email smallmarital@qq.com 
  16.  */ 
  17. @Component 
  18. public class RedisUtil { 
  19.  
  20.     @Autowired 
  21.     private RedisTemplate redisTemplate; 
  22.  
  23.     /** 
  24.      * 寫入緩存 
  25.      * 
  26.      * @param key 
  27.      * @param value 
  28.      * @return 
  29.      */ 
  30.     public boolean set(final String key, Object value) { 
  31.         boolean result = false
  32.         try { 
  33.             ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); 
  34.             operations.set(key, value); 
  35.             result = true
  36.         } catch (Exception e) { 
  37.             e.printStackTrace(); 
  38.         } 
  39.         return result; 
  40.     } 
  41.  
  42.     /** 
  43.      * 寫入緩存設置時間 
  44.      * 
  45.      * @param key 
  46.      * @param value 
  47.      * @param expireTime 
  48.      * @return 
  49.      */ 
  50.     public boolean setEx(final String key, Object value, long expireTime) { 
  51.         boolean result = false
  52.         try { 
  53.             ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); 
  54.             operations.set(key, value); 
  55.             redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); 
  56.             result = true
  57.         } catch (Exception e) { 
  58.             e.printStackTrace(); 
  59.         } 
  60.         return result; 
  61.     } 
  62.  
  63.     /** 
  64.      * 讀取緩存 
  65.      * 
  66.      * @param key 
  67.      * @return 
  68.      */ 
  69.     public Object get(final String key) { 
  70.         Object result = null
  71.         ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); 
  72.         result = operations.get(key); 
  73.         return result; 
  74.     } 
  75.  
  76.     /** 
  77.      * 刪除對應的value 
  78.      * 
  79.      * @param key 
  80.      */ 
  81.     public boolean remove(final String key) { 
  82.         if (exists(key)) { 
  83.             Boolean delete = redisTemplate.delete(key); 
  84.             return delete
  85.         } 
  86.         return false
  87.  
  88.     } 
  89.  
  90.     /** 
  91.      * 判斷key是否存在 
  92.      * 
  93.      * @param key 
  94.      * @return 
  95.      */ 
  96.     public boolean exists(final String key) { 
  97.         boolean result = false
  98.         ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); 
  99.         if (Objects.nonNull(operations.get(key))) { 
  100.             result = true
  101.         } 
  102.         return result; 
  103.     } 
  104.  
  105.  

自定義注解

自定義一個注解,定義此注解的目的是把它添加到需要實現冪等的方法上,只要某個方法注解了其,都會自動實現冪等操作。其代碼如下

  1. @Target({ElementType.METHOD}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. public @interface AutoIdempotent { 
  4.    

token 的創建和實現

token 服務接口,我們新建一個接口,創建token服務,里面主要是有兩個方法,一個用來創建 token,一個用來驗證token

  1. public interface TokenService { 
  2.  
  3.     /** 
  4.      * 創建token 
  5.      * @return 
  6.      */ 
  7.     public  String createToken(); 
  8.  
  9.     /** 
  10.      * 檢驗token 
  11.      * @param request 
  12.      * @return 
  13.      */ 
  14.     public boolean checkToken(HttpServletRequest request) throws Exception; 
  15.  

token 的實現類,token中引用了服務的實現類,token引用了 redis 服務,創建token采用隨機算法工具類生成隨機 uuid 字符串,然后放入 redis 中,如果放入成功,返回token,校驗方法就是從 header 中獲取 token 的值,如果不存在,直接跑出異常,這個異常信息可以被直接攔截到,返回給前端。

  1. package cn.smallmartial.demo.service.impl; 
  2.  
  3. import cn.smallmartial.demo.bean.RedisKeyPrefix; 
  4. import cn.smallmartial.demo.bean.ResponseCode; 
  5. import cn.smallmartial.demo.exception.ApiResult; 
  6. import cn.smallmartial.demo.exception.BusinessException; 
  7. import cn.smallmartial.demo.service.TokenService; 
  8. import cn.smallmartial.demo.utils.RedisUtil; 
  9. import io.netty.util.internal.StringUtil; 
  10. import org.springframework.beans.factory.annotation.Autowired; 
  11. import org.springframework.stereotype.Service; 
  12. import org.springframework.util.StringUtils; 
  13.  
  14. import javax.servlet.http.HttpServletRequest; 
  15. import java.util.Random; 
  16. import java.util.UUID; 
  17.  
  18. /** 
  19.  * @Author smallmartial 
  20.  * @Date 2020/4/16 
  21.  * @Email smallmarital@qq.com 
  22.  */ 
  23. @Service 
  24. public class TokenServiceImpl implements TokenService { 
  25.     @Autowired 
  26.     private RedisUtil redisService; 
  27.  
  28.     /** 
  29.      * 創建token 
  30.      * 
  31.      * @return 
  32.      */ 
  33.     @Override 
  34.     public String createToken() { 
  35.         String str = UUID.randomUUID().toString().replace("-"""); 
  36.         StringBuilder token = new StringBuilder(); 
  37.         try { 
  38.             token.append(RedisKeyPrefix.TOKEN_PREFIX).append(str); 
  39.             redisService.setEx(token.toString(), token.toString(), 10000L); 
  40.             boolean empty = StringUtils.isEmpty(token.toString()); 
  41.             if (!empty) { 
  42.                 return token.toString(); 
  43.             } 
  44.         } catch (Exception ex) { 
  45.             ex.printStackTrace(); 
  46.         } 
  47.         return null
  48.     } 
  49.  
  50.     /** 
  51.      * 檢驗token 
  52.      * 
  53.      * @param request 
  54.      * @return 
  55.      */ 
  56.     @Override 
  57.     public boolean checkToken(HttpServletRequest request) throws Exception { 
  58.  
  59.         String token = request.getHeader(RedisKeyPrefix.TOKEN_NAME); 
  60.         if (StringUtils.isEmpty(token)) {// header中不存在token 
  61.             token = request.getParameter(RedisKeyPrefix.TOKEN_NAME); 
  62.             if (StringUtils.isEmpty(token)) {// parameter中也不存在token 
  63.                 throw new BusinessException(ApiResult.BADARGUMENT); 
  64.             } 
  65.         } 
  66.  
  67.         if (!redisService.exists(token)) { 
  68.             throw new BusinessException(ApiResult.REPETITIVE_OPERATION); 
  69.         } 
  70.  
  71.         boolean remove = redisService.remove(token); 
  72.         if (!remove) { 
  73.             throw new BusinessException(ApiResult.REPETITIVE_OPERATION); 
  74.         } 
  75.         return true
  76.     } 

攔截器的配置

用于攔截前端的 token,判斷前端的 token 是否有效

  1. @Configuration 
  2. public class WebMvcConfiguration extends WebMvcConfigurationSupport { 
  3.  
  4.     @Bean 
  5.     public AuthInterceptor authInterceptor() { 
  6.         return new AuthInterceptor(); 
  7.     } 
  8.  
  9.     /** 
  10.      * 攔截器配置 
  11.      * 
  12.      * @param registry 
  13.      */ 
  14.     @Override 
  15.     public void addInterceptors(InterceptorRegistry registry) { 
  16.         registry.addInterceptor(authInterceptor()); 
  17. //                .addPathPatterns("/ksb/**"
  18. //                .excludePathPatterns("/ksb/auth/**""/api/common/**""/error""/api/*"); 
  19.         super.addInterceptors(registry); 
  20.     } 
  21.  
  22.     @Override 
  23.     public void addResourceHandlers(ResourceHandlerRegistry registry) { 
  24.         registry.addResourceHandler("/**").addResourceLocations( 
  25.                 "classpath:/static/"); 
  26.         registry.addResourceHandler("swagger-ui.html").addResourceLocations( 
  27.                 "classpath:/META-INF/resources/"); 
  28.         registry.addResourceHandler("/webjars/**").addResourceLocations( 
  29.                 "classpath:/META-INF/resources/webjars/"); 
  30.         super.addResourceHandlers(registry); 
  31.     } 
  32.  
  33.  

攔截處理器:主要用于攔截掃描到 Autoldempotent 到注解方法,然后調用 tokenService 的 checkToken 方法校驗 token 是否正確,如果捕捉到異常就把異常信息渲染成 json 返回給前端。這部分代碼主要和自定義注解部分掛鉤。其主要代碼如下所示

  1. @Slf4j 
  2. public class AuthInterceptor extends HandlerInterceptorAdapter { 
  3.  
  4.     @Autowired 
  5.     private TokenService tokenService; 
  6.  
  7.     @Override 
  8.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
  9.  
  10.         if (!(handler instanceof HandlerMethod)) { 
  11.             return true
  12.         } 
  13.         HandlerMethod handlerMethod = (HandlerMethod) handler; 
  14.         Method method = handlerMethod.getMethod(); 
  15.         //被ApiIdempotment標記的掃描 
  16.         AutoIdempotent methodAnnotation = method.getAnnotation(AutoIdempotent.class); 
  17.         if (methodAnnotation != null) { 
  18.             try { 
  19.                 return tokenService.checkToken(request);// 冪等性校驗, 校驗通過則放行, 校驗失敗則拋出異常, 并通過統一異常處理返回友好提示 
  20.             } catch (Exception ex) { 
  21.                 throw new BusinessException(ApiResult.REPETITIVE_OPERATION); 
  22.             } 
  23.         } 
  24.         return true
  25.     } 
  26.  

測試用例

這里進行相關的測試用例 模擬業務請求類,通過相關的路徑獲得相關的token,然后調用 testidempotence 方法,這個方法注解了 @Autoldempotent,攔截器會攔截所有的請求,當判斷到處理的方法上面有該注解的時候,就會調用 TokenService 中的 checkToken() 方法,如果有異常會跑出,代碼如下所示

  1. /** 
  2.  * @Author smallmartial 
  3.  * @Date 2020/4/16 
  4.  * @Email smallmarital@qq.com 
  5.  */ 
  6. @RestController 
  7. public class BusinessController { 
  8.  
  9.  
  10.     @Autowired 
  11.     private TokenService tokenService; 
  12.  
  13.     @GetMapping("/get/token"
  14.     public Object  getToken(){ 
  15.         String token = tokenService.createToken(); 
  16.         return ResponseUtil.ok(token) ; 
  17.     } 
  18.  
  19.  
  20.     @AutoIdempotent 
  21.     @GetMapping("/test/Idempotence"
  22.     public Object testIdempotence() { 
  23.         String token = "接口冪等性測試"
  24.         return ResponseUtil.ok(token) ; 
  25.     } 

用瀏覽器進行訪問

用獲取到的token第一次訪問

用獲取到的token再次訪問可以看到,第二次訪問失敗,即,冪等性驗證通過。

關于作者

我是小小,雙魚座的程序猿,活在一線城市,我們下期再見。

 

責任編輯:武曉燕 來源: 小明菜市場
相關推薦

2021-10-22 14:50:23

Spring BootJava

2020-09-09 09:55:36

JavaNIOBIO

2020-05-07 10:05:58

Spring循環依賴Java

2021-06-25 09:47:59

Spring循環依賴Java

2020-07-29 10:40:21

Spring循環依賴Java

2024-08-29 09:01:39

2018-09-21 15:50:58

數據庫MySQL分庫分表

2020-06-18 11:58:13

蘋果MacOS保密

2019-10-17 09:26:05

MySQL數據庫InnoDB

2019-09-29 10:04:26

技術編程開發

2020-10-18 07:24:16

數字證書簽名網絡協議

2021-10-27 09:55:55

Sharding-Jd分庫分表Java

2024-03-13 15:18:00

接口冪等性高并發

2025-02-23 08:00:00

冪等性Java開發

2025-09-02 07:16:37

2025-07-25 01:00:00

Redis+接口冪等性

2021-01-18 14:34:59

冪等性接口客戶端

2024-06-24 01:00:00

2021-06-21 15:57:08

微服務架構數據

2024-11-01 09:28:02

點贊
收藏

51CTO技術棧公眾號

freemovies性欧美| www.在线观看av| 成人公开免费视频| 伊人成综合网yiren22| 欧美日韩国产专区| 日韩网站在线| 日韩欧美另类在线| 日本中文字幕亚洲| 欧美精品a∨在线观看不卡 | 99r国产精品| 欧美亚洲激情在线| 又黄又爽的网站| 成人美女视频| 亚洲欧洲99久久| 国产欧美韩日| 中文字幕激情视频| 欧美日韩第一区| 日韩精品免费在线视频| 天美星空大象mv在线观看视频| 粗大黑人巨茎大战欧美成人| 欧美jizzhd欧美| 欧美a级理论片| 欧美激情二区三区| 久久精品—区二区三区舞蹈| 成人激情久久| 欧美性猛交xxxx富婆弯腰| 欧美xxxx黑人又粗又长精品| 亚洲天堂久久久久| 国产一区二区三区久久| xxxxxxxxx欧美| 艳妇乳肉亭妇荡乳av| 日韩av黄色| 狠狠色噜噜狠狠狠狠97| 中文字幕一区二区三区在线乱码 | 亚洲japanese制服美女| www.国产色| 亚洲综合五月| 亚洲午夜女主播在线直播| 粗大的内捧猛烈进出视频| 亚洲播播91| 亚洲一区二区三区爽爽爽爽爽| 日韩国产在线一区| 天堂成人在线观看| 国产美女精品人人做人人爽 | 日韩成年人视频| 国产精品videosex性欧美| 国产婷婷97碰碰久久人人蜜臀 | 久久久久久久网| 国产日韩欧美在线| 国产精品成人久久久| 国产精品试看| 国产69精品久久久| 免费在线观看国产精品| 日韩中文在线电影| 中文字幕av一区中文字幕天堂| 女同性恋一区二区三区| 亚洲日本va中文字幕| 7777精品伊人久久久大香线蕉的| 日韩精品一区二区三区不卡| 天堂av在线网| 精品久久久免费| 97视频在线免费| 青草在线视频在线观看| 亚洲三级在线免费| 中文字幕中文字幕一区三区| 午夜免费视频在线国产| 亚洲国产高清aⅴ视频| 日韩欧美99| 国产精品一级伦理| 国产女同互慰高潮91漫画| 国产色综合一区二区三区| 亚洲男女视频在线观看| 成人夜色视频网站在线观看| av在线亚洲男人的天堂| 亚洲av无码乱码国产麻豆| 国产精品一区二区黑丝| 国产成人精品自拍| 天堂av资源在线| 91在线观看高清| 精选一区二区三区四区五区| 成人福利免费观看| 亚洲色成人一区二区三区小说| 午夜伦理在线视频| 亚洲综合一区二区精品导航| av无码久久久久久不卡网站| 激情图片在线观看高清国产| 亚洲一区二区精品视频| 777777av| 992tv国产精品成人影院| 91黄色免费版| 国产亚洲视频一区| 日本一区二区三区视频在线看| 日韩精品一区二区三区在线 | 精品影院一区| 欧美国产精品劲爆| 免费看啪啪网站| 日韩另类在线| 日韩欧美成人免费视频| 香蕉视频禁止18| 香蕉久久久久久| 欧美大胆一级视频| 3d动漫精品啪啪一区二区下载 | 欧洲成人一区| 欧美一级一级性生活免费录像| 中文字幕18页| 精品国产一区二区三区久久久樱花| 中文字幕久久亚洲| 欧美88888| 一区免费在线| 国产精品三级网站| 国产高潮流白浆喷水视频| 99re这里只有精品视频首页| 亚洲欧美日产图| av毛片午夜不卡高**水| 色婷婷综合久色| 中文字幕制服丝袜| 激情综合网五月| 久久国产精品影片| 欧美日韩 一区二区三区| 国产精品一区免费在线观看| 欧美一区二区三区在线播放| 呦呦在线视频| 在线免费观看日本欧美| 国产精品99久久久精品无码| 久久av电影| 欧美激情视频在线免费观看 欧美视频免费一| 日韩精品一区二区不卡| 久久国产精品无码网站| 九色视频成人porny| 岛国视频免费在线观看| 亚洲成人自拍网| 一女二男3p波多野结衣| 欧美激情在线精品一区二区三区| 欧美裸体男粗大视频在线观看| 亚洲精品一区二三区| 成人免费毛片嘿嘿连载视频| 亚洲巨乳在线观看| 中文字幕在线直播| 亚洲第一视频网站| 国产精品成人网站| 国产美女精品人人做人人爽 | 免费观看黄一级视频| 中文字幕在线播放不卡一区| 欧美亚洲另类色图| 国产精品久久久久久久久久白浆| 久久精品国产一区二区电影| 亚洲永久精品一区| 久久新电视剧免费观看| 黄页免费在线观看视频| 国产视频一区二| 色婷婷综合久久久久中文字幕1| 国产亚洲欧美日韩高清| 91亚洲午夜精品久久久久久| 国产高清www| 精品国产鲁一鲁****| 中文字幕日韩欧美精品在线观看| 无码aⅴ精品一区二区三区| av一区二区三区四区| 国产91沈先生在线播放| 亚洲综合色婷婷在线观看| 欧美成人一区在线| 性生活黄色大片| 国产精品你懂的在线| 特级丰满少妇一级| 成人毛片在线| 国产欧美一区二区| 麻豆网在线观看| 91精品国产色综合久久久蜜香臀| 男人的天堂久久久| 精品一区二区在线观看| 一本一本久久a久久精品综合妖精| 色香欲www7777综合网| 亚洲日韩欧美视频一区| 天堂免费在线视频| 国产精品乱码妇女bbbb| 五月天激情播播| 欧美激情四色| 美女三级99| 韩日精品一区| 九九热这里只有在线精品视| 你懂的网站在线| 欧美日韩亚洲高清| 成年人免费观看视频网站| 天堂资源在线中文精品| 亚洲韩国在线| 一区二区三区自拍视频| 2019中文字幕免费视频| jizz在线免费观看| 欧美日韩你懂得| 久久久久99精品成人片试看| 国产白丝精品91爽爽久久| 黄色片网址在线观看| 免费看成人吃奶视频在线| 99riav久久精品riav| 欧美成人免费在线| 久久天堂av| 久久香蕉频线观| 日韩中文字幕影院| 在线观看国产91| 五月天色婷婷丁香| 成人免费高清视频| 少妇激情一区二区三区| 欧美1区2区3区| 欧美精品在线一区| 久久久久九九精品影院| 91精品国产高清自在线| 3p在线观看| 亚洲国产精品yw在线观看| av片免费观看| 亚洲综合丝袜美腿| 国产熟女一区二区| 国产风韵犹存在线视精品| 成人三级视频在线播放 | 日本不卡二区高清三区| 99精品国自产在线| 欧美激情免费看| 天天在线视频色| 亚洲激情视频网| 国产精品一品二区三区的使用体验| 天天操天天干天天综合网| 91麻豆精品国产91久久久久久久久 | 韩国亚洲精品| 亚洲成色最大综合在线| 福利电影一区| 国产日韩欧美视频| 波多野结衣亚洲| 欧美激情亚洲国产| 麻豆av在线导航| 日韩二区三区在线| 国产高清免费在线观看| 欧美性生活大片视频| 亚洲欧美精品一区二区三区| 亚洲自拍偷拍九九九| 欧美特级黄色录像| 91麻豆swag| www.美色吧.com| 久久狠狠亚洲综合| 91欧美视频在线| 日韩精品1区2区3区| 人妻少妇精品无码专区二区| 在线一区免费| 亚洲一区二区三区精品在线观看| 亚洲超碰在线观看| 91久久久精品| 欧美少妇激情| 91精品国产91久久久久久| 男人天堂久久久| 亚洲视频一区二区三区| 青青久草在线| 日韩精品在线免费观看视频| 黄片毛片在线看| 在线播放亚洲一区| 黄色片视频免费| 日韩欧美国产一区二区| 精品国产乱子伦| 欧洲av一区二区嗯嗯嗯啊| 欧美一级高潮片| 亚洲一二三区不卡| 久久亚洲国产成人精品性色| 亚洲人成网站在线| 中文字幕电影av| 椎名由奈av一区二区三区| 亚洲人做受高潮| 中文字幕在线免费不卡| 大地资源高清在线视频观看| 一区二区三区四区蜜桃 | 中文字幕日本不卡| 免费在线观看黄色小视频| 亚洲欧美一区二区在线观看| 天堂资源在线视频| 一色屋精品亚洲香蕉网站| www.超碰在线观看| 亚洲综合一二三区| 亚洲免费激情视频| 色综合色综合色综合色综合色综合 | 国产高清一区日本| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 永久免费看片在线播放| 色呦呦日韩精品| 一级全黄裸体免费视频| 欧美一区二区黄色| 国产免费黄色片| 欧美大片在线观看一区| 手机av免费在线观看| 国产偷国产偷亚洲清高网站| 搞黄视频在线观看| 久久亚洲影音av资源网 | 日本免费黄色小视频| 激情另类综合| 成年人看的毛片| 日韩高清在线观看| 久久久福利影院| 99re热这里只有精品免费视频| 手机免费看av片| 欧美国产日本视频| 久草成人在线视频| 色综合色综合色综合色综合色综合| 中文字幕777| 亚洲精品一区二区三区99| 欧洲av在线播放| 中文字幕精品在线| 麻豆av在线播放| 国产精品久久久久久久9999 | 久久九九国产精品| 亚洲免费人成在线视频观看| 日本精品久久久久| 亚洲国产成人久久综合| 都市激情一区| 午夜精品福利电影| 123成人网| 国产精品一区二| 久久人人88| 97国产精东麻豆人妻电影| 精品一区二区三区欧美| www.久久av| 亚洲国产一二三| 夜夜爽8888| 亚洲一区二区福利| 国产h片在线观看| 91在线看网站| 久久一区二区三区喷水| 成人黄色片视频| 成人午夜激情在线| 免费中文字幕在线| 欧美精品自拍偷拍动漫精品| 国产色a在线| 456亚洲影院| 卡通动漫国产精品| 97超碰国产精品| 国产乱人伦精品一区二区在线观看| av电影网站在线观看| 欧美日韩国产在线看| 男人天堂综合网| 国产做受69高潮| caoporn成人免费视频在线| 一区二区三区国产福利| 玖玖在线精品| 亚洲天堂视频一区| 欧美日韩午夜视频在线观看| 欧美自拍偷拍第一页| 久久久人成影片一区二区三区观看| 精品国产亚洲一区二区三区| 中文网丁香综合网| 麻豆久久久久久| 天美传媒免费在线观看| 欧美亚洲动漫精品| 最新97超碰在线| 国产精品网站视频| 99久久婷婷国产综合精品电影√| www.com操| 亚洲色图19p| www.香蕉视频| 欧美激情视频一区二区| 亚洲综合影院| 国产午夜福利在线播放| 91免费国产在线| 日韩美一区二区| 中文字幕av一区二区| 24小时成人在线视频| 996这里只有精品| 成人午夜视频在线| 亚洲国产成人无码av在线| 国产一区二区三区丝袜| 日本久久久久| 九一免费在线观看| 9l国产精品久久久久麻豆| 天堂а√在线中文在线新版| 国产一区二区三区在线视频| 韩国精品视频在线观看 | 欧美做暖暖视频| 成人app下载| 国产情侣小视频| 精品中文字幕在线2019| 久久超级碰碰| 免费看污黄网站| 亚洲另类中文字| 亚洲日本国产精品| 国产综合久久久久久| 亚洲一本视频| 色欲狠狠躁天天躁无码中文字幕 | 亚洲奶汁xxxx哺乳期| 热re91久久精品国99热蜜臀| 日本久久精品| 性一交一黄一片| 色婷婷av一区二区三区软件| 欧美日本高清| 精品麻豆av| 国内欧美视频一区二区| 日韩av男人天堂| 日韩在线视频二区| 好吊妞视频这里有精品| 免费观看成人在线视频| 亚洲免费观看高清完整版在线观看 | 蜜桃视频在线一区| 国产极品在线播放| 久久精品成人一区二区三区 | 亚洲欧美日韩中文视频| 国产精品久久免费视频| 女性隐私黄www网站视频| 伊人一区二区三区|