国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Springboot + redis + 注解 + 攔截器來實現(xiàn)接口冪等性校驗

共 8288字,需瀏覽 17分鐘

 ·

2020-08-14 15:24

一、概念

冪等性, 通俗的說就是一個接口, 多次發(fā)起同一個請求, 必須保證操作只能執(zhí)行一次
比如:

  • 訂單接口, 不能多次創(chuàng)建訂單

  • 支付接口, 重復支付同一筆訂單只能扣一次錢

  • 支付寶回調(diào)接口, 可能會多次回調(diào), 必須處理重復回調(diào)

  • 普通表單提交接口, 因為網(wǎng)絡超時等原因多次點擊提交, 只能成功一次
    等等

二、常見解決方案

  • 唯一索引 -- 防止新增臟數(shù)據(jù)

  • token機制 -- 防止頁面重復提交

  • 悲觀鎖 -- 獲取數(shù)據(jù)的時候加鎖(鎖表或鎖行)

  • 樂觀鎖 -- 基于版本號version實現(xiàn), 在更新數(shù)據(jù)那一刻校驗數(shù)據(jù)

  • 分布式鎖 -- redis(jedis、redisson)或zookeeper實現(xiàn)

  • 狀態(tài)機 -- 狀態(tài)變更, 更新數(shù)據(jù)時判斷狀態(tài)

三、本文實現(xiàn)

本文采用第2種方式實現(xiàn), 即通過redis + token機制實現(xiàn)接口冪等性校驗

四、實現(xiàn)思路

為需要保證冪等性的每一次請求創(chuàng)建一個唯一標識token, 先獲取token, 并將此token存入redis, 請求接口時, 將此token放到header或者作為請求參數(shù)請求接口, 后端接口判斷redis中是否存在此token:

  • 如果存在, 正常處理業(yè)務邏輯, 并從redis中刪除此token, 那么, 如果是重復請求, 由于token已被刪除, 則不能通過校驗, 返回請勿重復操作提示

  • 如果不存在, 說明參數(shù)不合法或者是重復請求, 返回提示即可

五、項目簡介

  • springboot

  • redis

  • @ApiIdempotent注解 + 攔截器對請求進行攔截

  • @ControllerAdvice全局異常處理

  • 壓測工具: jmeter

說明:

本文重點介紹冪等性核心實現(xiàn), 關(guān)于springboot如何集成redis、ServerResponse、ResponseCode等細枝末節(jié)不在本文討論范圍之內(nèi), 有興趣的小伙伴可以查看我的Github項目:

https://github.com/wangzaiplus/springboot/tree/wxw

六、代碼實現(xiàn)

pom

????????
????????<dependency>
????????????<groupId>redis.clientsgroupId>
????????????<artifactId>jedisartifactId>
????????????<version>2.9.0version>
????????dependency>

????????
????????<dependency>
????????????<groupId>org.projectlombokgroupId>
????????????<artifactId>lombokartifactId>
????????????<version>1.16.10version>
????????dependency>

JedisUtil

package?com.wangzaiplus.test.util;

import?lombok.extern.slf4j.Slf4j;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.stereotype.Component;
import?redis.clients.jedis.Jedis;
import?redis.clients.jedis.JedisPool;

@Component
@Slf4j
public?class?JedisUtil?{

????@Autowired
????private?JedisPool?jedisPool;

????private?Jedis?getJedis()?{
????????return?jedisPool.getResource();
????}

????/**
?????*?設(shè)值
?????*
?????*?@param?key
?????*?@param?value
?????*?@return
?????*/

????public?String?set(String?key,?String?value)?{
????????Jedis?jedis?=?null;
????????try?{
????????????jedis?=?getJedis();
????????????return?jedis.set(key,?value);
????????}?catch?(Exception?e)?{
????????????log.error("set?key:{}?value:{}?error",?key,?value,?e);
????????????return?null;
????????}?finally?{
????????????close(jedis);
????????}
????}

????/**
?????*?設(shè)值
?????*
?????*?@param?key
?????*?@param?value
?????*?@param?expireTime?過期時間,?單位:?s
?????*?@return
?????*/

????public?String?set(String?key,?String?value,?int?expireTime)?{
????????Jedis?jedis?=?null;
????????try?{
????????????jedis?=?getJedis();
????????????return?jedis.setex(key,?expireTime,?value);
????????}?catch?(Exception?e)?{
????????????log.error("set?key:{}?value:{}?expireTime:{}?error",?key,?value,?expireTime,?e);
????????????return?null;
????????}?finally?{
????????????close(jedis);
????????}
????}

????/**
?????*?取值
?????*
?????*?@param?key
?????*?@return
?????*/

????public?String?get(String?key)?{
????????Jedis?jedis?=?null;
????????try?{
????????????jedis?=?getJedis();
????????????return?jedis.get(key);
????????}?catch?(Exception?e)?{
????????????log.error("get?key:{}?error",?key,?e);
????????????return?null;
????????}?finally?{
????????????close(jedis);
????????}
????}

????/**
?????*?刪除key
?????*
?????*?@param?key
?????*?@return
?????*/

????public?Long?del(String?key)?{
????????Jedis?jedis?=?null;
????????try?{
????????????jedis?=?getJedis();
????????????return?jedis.del(key.getBytes());
????????}?catch?(Exception?e)?{
????????????log.error("del?key:{}?error",?key,?e);
????????????return?null;
????????}?finally?{
????????????close(jedis);
????????}
????}

????/**
?????*?判斷key是否存在
?????*
?????*?@param?key
?????*?@return
?????*/

????public?Boolean?exists(String?key)?{
????????Jedis?jedis?=?null;
????????try?{
????????????jedis?=?getJedis();
????????????return?jedis.exists(key.getBytes());
????????}?catch?(Exception?e)?{
????????????log.error("exists?key:{}?error",?key,?e);
????????????return?null;
????????}?finally?{
????????????close(jedis);
????????}
????}

????/**
?????*?設(shè)值key過期時間
?????*
?????*?@param?key
?????*?@param?expireTime?過期時間,?單位:?s
?????*?@return
?????*/

????public?Long?expire(String?key,?int?expireTime)?{
????????Jedis?jedis?=?null;
????????try?{
????????????jedis?=?getJedis();
????????????return?jedis.expire(key.getBytes(),?expireTime);
????????}?catch?(Exception?e)?{
????????????log.error("expire?key:{}?error",?key,?e);
????????????return?null;
????????}?finally?{
????????????close(jedis);
????????}
????}

????/**
?????*?獲取剩余時間
?????*
?????*?@param?key
?????*?@return
?????*/

????public?Long?ttl(String?key)?{
????????Jedis?jedis?=?null;
????????try?{
????????????jedis?=?getJedis();
????????????return?jedis.ttl(key);
????????}?catch?(Exception?e)?{
????????????log.error("ttl?key:{}?error",?key,?e);
????????????return?null;
????????}?finally?{
????????????close(jedis);
????????}
????}

????private?void?close(Jedis?jedis)?{
????????if?(null?!=?jedis)?{
????????????jedis.close();
????????}
????}

}

自定義注解@ApiIdempotent

package?com.wangzaiplus.test.annotation;

import?java.lang.annotation.ElementType;
import?java.lang.annotation.Retention;
import?java.lang.annotation.RetentionPolicy;
import?java.lang.annotation.Target;

/**
?*?在需要保證?接口冪等性?的Controller的方法上使用此注解
?*/

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public?@interface?ApiIdempotent?{
}

ApiIdempotentInterceptor攔截器

package?com.wangzaiplus.test.interceptor;

import?com.wangzaiplus.test.annotation.ApiIdempotent;
import?com.wangzaiplus.test.service.TokenService;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.web.method.HandlerMethod;
import?org.springframework.web.servlet.HandlerInterceptor;
import?org.springframework.web.servlet.ModelAndView;

import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
import?java.lang.reflect.Method;

/**
?*?接口冪等性攔截器
?*/

public?class?ApiIdempotentInterceptor?implements?HandlerInterceptor?{

????@Autowired
????private?TokenService?tokenService;

????@Override
????public?boolean?preHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)?{
????????if?(!(handler?instanceof?HandlerMethod))?{
????????????return?true;
????????}

????????HandlerMethod?handlerMethod?=?(HandlerMethod)?handler;
????????Method?method?=?handlerMethod.getMethod();

????????ApiIdempotent?methodAnnotation?=?method.getAnnotation(ApiIdempotent.class);
????????if?(methodAnnotation?!=?null)?{
????????????check(request);//?冪等性校驗,?校驗通過則放行,?校驗失敗則拋出異常,?并通過統(tǒng)一異常處理返回友好提示
????????}

????????return?true;
????}

????private?void?check(HttpServletRequest?request)?{
????????tokenService.checkToken(request);
????}

????@Override
????public?void?postHandle(HttpServletRequest?httpServletRequest,?HttpServletResponse?httpServletResponse,?Object?o,?ModelAndView?modelAndView)?throws?Exception?{
????}

????@Override
????public?void?afterCompletion(HttpServletRequest?httpServletRequest,?HttpServletResponse?httpServletResponse,?Object?o,?Exception?e)?throws?Exception?{
????}
}

TokenServiceImpl

package?com.wangzaiplus.test.service.impl;

import?com.wangzaiplus.test.common.Constant;
import?com.wangzaiplus.test.common.ResponseCode;
import?com.wangzaiplus.test.common.ServerResponse;
import?com.wangzaiplus.test.exception.ServiceException;
import?com.wangzaiplus.test.service.TokenService;
import?com.wangzaiplus.test.util.JedisUtil;
import?com.wangzaiplus.test.util.RandomUtil;
import?lombok.extern.slf4j.Slf4j;
import?org.apache.commons.lang3.StringUtils;
import?org.apache.commons.lang3.text.StrBuilder;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.stereotype.Service;

import?javax.servlet.http.HttpServletRequest;

@Service
public?class?TokenServiceImpl?implements?TokenService?{

????private?static?final?String?TOKEN_NAME?=?"token";

????@Autowired
????private?JedisUtil?jedisUtil;

????@Override
????public?ServerResponse?createToken()?{
????????String?str?=?RandomUtil.UUID32();
????????StrBuilder?token?=?new?StrBuilder();
????????token.append(Constant.Redis.TOKEN_PREFIX).append(str);

????????jedisUtil.set(token.toString(),?token.toString(),?Constant.Redis.EXPIRE_TIME_MINUTE);

????????return?ServerResponse.success(token.toString());
????}

????@Override
????public?void?checkToken(HttpServletRequest?request)?{
????????String?token?=?request.getHeader(TOKEN_NAME);
????????if?(StringUtils.isBlank(token))?{//?header中不存在token
????????????token?=?request.getParameter(TOKEN_NAME);
????????????if?(StringUtils.isBlank(token))?{//?parameter中也不存在token
????????????????throw?new?ServiceException(ResponseCode.ILLEGAL_ARGUMENT.getMsg());
????????????}
????????}

????????if?(!jedisUtil.exists(token))?{
????????????throw?new?ServiceException(ResponseCode.REPETITIVE_OPERATION.getMsg());
????????}

????????Long?del?=?jedisUtil.del(token);
????????if?(del?<=?0)?{
????????????throw?new?ServiceException(ResponseCode.REPETITIVE_OPERATION.getMsg());
????????}
????}

}

TestApplication

package?com.wangzaiplus.test;

import?com.wangzaiplus.test.interceptor.ApiIdempotentInterceptor;
import?org.mybatis.spring.annotation.MapperScan;
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.context.annotation.Bean;
import?org.springframework.web.cors.CorsConfiguration;
import?org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import?org.springframework.web.filter.CorsFilter;
import?org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import?org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootApplication
@MapperScan("com.wangzaiplus.test.mapper")
public?class?TestApplication??extends?WebMvcConfigurerAdapter?{

????public?static?void?main(String[]?args)?{
????????SpringApplication.run(TestApplication.class,?args);
????}

????/**
?????*?跨域
?????*?@return
?????*/

????@Bean
????public?CorsFilter?corsFilter()?{
????????final?UrlBasedCorsConfigurationSource?urlBasedCorsConfigurationSource?=?new?UrlBasedCorsConfigurationSource();
????????final?CorsConfiguration?corsConfiguration?=?new?CorsConfiguration();
????????corsConfiguration.setAllowCredentials(true);
????????corsConfiguration.addAllowedOrigin("*");
????????corsConfiguration.addAllowedHeader("*");
????????corsConfiguration.addAllowedMethod("*");
????????urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",?corsConfiguration);
????????return?new?CorsFilter(urlBasedCorsConfigurationSource);
????}

????@Override
????public?void?addInterceptors(InterceptorRegistry?registry)?{
????????//?接口冪等性攔截器
????????registry.addInterceptor(apiIdempotentInterceptor());
????????super.addInterceptors(registry);
????}

????@Bean
????public?ApiIdempotentInterceptor?apiIdempotentInterceptor()?{
????????return?new?ApiIdempotentInterceptor();
????}

}

OK, 目前為止, 校驗代碼準備就緒, 接下來測試驗證

七、測試驗證

1、獲取token的控制器TokenController

package?com.wangzaiplus.test.controller;

import?com.wangzaiplus.test.common.ServerResponse;
import?com.wangzaiplus.test.service.TokenService;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.web.bind.annotation.GetMapping;
import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/token")
public?class?TokenController?{

????@Autowired
????private?TokenService?tokenService;

????@GetMapping
????public?ServerResponse?token()?{
????????return?tokenService.createToken();
????}

}

2、TestController, 注意@ApiIdempotent注解, 在需要冪等性校驗的方法上聲明此注解即可, 不需要校驗的無影響

package?com.wangzaiplus.test.controller;

import?com.wangzaiplus.test.annotation.ApiIdempotent;
import?com.wangzaiplus.test.common.ServerResponse;
import?com.wangzaiplus.test.service.TestService;
import?lombok.extern.slf4j.Slf4j;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.web.bind.annotation.PostMapping;
import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
@Slf4j
public?class?TestController?{

????@Autowired
????private?TestService?testService;

????@ApiIdempotent
????@PostMapping("testIdempotence")
????public?ServerResponse?testIdempotence()?{
????????return?testService.testIdempotence();
????}

}

3、獲取token

查看redis

4、測試接口安全性: 利用jmeter測試工具模擬50個并發(fā)請求, 將上一步獲取到的token作為參數(shù)

5、header或參數(shù)均不傳token, 或者token值為空, 或者token值亂填, 均無法通過校驗, 如token值為"abcd"

八、注意點(非常重要)

上圖中, 不能單純的直接刪除token而不校驗是否刪除成功, 會出現(xiàn)并發(fā)安全性問題, 因為, 有可能多個線程同時走到第46行, 此時token還未被刪除, 所以繼續(xù)往下執(zhí)行, 如果不校驗jedisUtil.del(token)的刪除結(jié)果而直接放行, 那么還是會出現(xiàn)重復提交問題, 即使實際上只有一次真正的刪除操作, 下面重現(xiàn)一下

稍微修改一下代碼:

再次請求

再看看控制臺

雖然只有一個真正刪除掉token, 但由于沒有對刪除結(jié)果進行校驗, 所以還是有并發(fā)問題, 因此, 必須校驗

九、總結(jié)

其實思路很簡單, 就是每次請求保證唯一性, 從而保證冪等性, 通過攔截器+注解, 就不用每次請求都寫重復代碼, 其實也可以利用spring aop實現(xiàn), 無所謂。

Github

https://github.com/wangzaiplus/springboot/tree/wxw

作者:wangzaiplus

www.jianshu.com/p/6189275403ed




?--END--


? 推薦

公眾號ID|javabaiwen

小編微信|619531440


每天分享技術(shù)干貨

視頻 | 電子書 | 面試題?|?開發(fā)經(jīng)驗

瀏覽 69
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美成人69| 97精品人妻一区二区三区香蕉农| 日韩黄色小视频| 亚洲素人无码| 欧美午夜福利在线观看| 久久久91人妻无码精品蜜桃ID| 九九热精品视频在线播放| 亚洲免费观看高清完| 特级西西444WWW大精品视频| 东方av在线播放| 日韩精品欧美一区二区三区| 四虎成人精品在永久免费| 神马午夜av| 北条麻妃无码一区二区| 在线免费观看国产视频| 日本黄色中文字幕| 91精品国产一区三一| 天天干天天做| 人人妻人人要| 三级无码AV| 欧美亚洲日本| 草逼123| 日本黄色免费视频| 亚洲一区二区AV| 国产一级A片视频| 亚洲黄色免费在线观看| 中文字幕免费在线观看视频| 亚洲视频在线播放| 亚洲欧美成人电影| 特黄特色一级特黄大片| av毛片| 国产精品免费观看久久久久久久久 | 狼人亚洲伊人| 乖我硬了让老子cao你小视频| 麻豆黄色电影| www深夜成人a√在线| 天天干天天日天天射| 亚洲无吗在线播放| 大香蕉人人| 91无码人妻一区二区成人aⅴ| 菊花插综合网| 3D动漫精品啪啪一区二区下载| 中文字幕巨肉乱码中文乱码| 亚洲香蕉av| 操逼五月天| 青青欧美| 日本高清视频网站| 日本午夜福利电影| 国产人妖TS重口系列网站观看 | 亚洲性爱专区| 国产毛片基地| 亚洲插菊花综合网| 韩国一区二区三区在线观看| 大地二中文在线观看免费鲁大师| 91狠狠色丁香婷婷综合久久精品 | 成人肏屄视频| 夜夜骑夜夜撸| 国产毛片欧美毛片高潮| 免费操逼视频网站| 精品一区二区三区在线观看| 91丨熟女丨露脸| 狠狠干狠狠操| 青娱乐无码| 天堂a√在线8| 精品少妇无码视频| 山东熟妇搡BBBB搡BBBB| 视频一区二区三区在线观看| 97国产精品视频人人做人人爱| 欧美日韩一区二区三区在线电影| 久久草在线观看| 特级艺体西西444WWw| 99精品999| a亚洲天堂| 成人视频免费网站| 伊人看片| 日本黄色免费在线观看| 亚洲av无码精品| 成人三区| 五月天狠狠干| 特黄特色大片BBBB| 久久99视频免费观看| 日韩免费高清在线视频| 91亚洲视频在线观看| 一级黄色小视频| 国产www视频| 亚洲一级免费在线观看| 黃色一级一片免费播放| 99热都是精品| 日本中文字幕不卡| 九九热在线精品视频| 伊人日日| 青青草免费在线视频| 国产成人在线免费视频| 喷潮视频| 亚洲天堂网在线观看视频| 中文字幕综合在线| 日韩欧美不卡色不卡| 俺来了俺去了| 欧美亚洲日本| 青青视频网| 亚洲熟女一区二区| 特级黄色A片| 男女操逼视频网站免费| 欧美激情一区二区| 91小仙女jK白丝袜呻吟| 无码影音| 国产一级a毛一级a毛视频在线网站)| 最近中文字幕无码| 国产精品欧美性爱| 久久99精品国产.久久久久| 欧美一级爱爱| 中文字幕第83页| 91精品久久久久久久久| 爱色五月| 可以免费看的黄色视频| 日韩中文字幕视频在线| 99久久国产视频| 成人精东影业JDAV3密友| 亚洲无码在| 免费婷婷| 大鸡吧视频在线观看| 四虎在线视频| 伊人在线视频观看| 中文字幕在线乱| 久久国产2025| 欧美性一区| 在线观看AV无码| 亚洲中文字幕在线播放| 国产自偷自拍| 狠狠操在线| 护士小雪的yin荡高日记H视频| 农村一级婬片A片AAA毛片古装| 四虎性爱视频| 国产黄色视频在线看| 久久精品波多野结衣| 天天爽夜夜爽夜夜爽| 午夜免费福利视频| 中文字幕精品一区久久久久| 青娱乐国产AV| 日本不卡一区二区三区四区| 久久午夜无码鲁片午夜精品男男 | 欧美亚洲综合手机在线| 亚洲麻豆| 亚洲综合五月天婷婷丁香| 综合网久久| 久久久久成人片免费观看蜜芽| 97国产精品视频| 欧美一级黄色A片| 国产精品一区二区性色AV| 亚洲黄色视频在线| 奇米影视狠狠干| 国产视频第一页| 日韩在线视频一区二区三区| 亚洲熟女av中文字幕| 久久久成人免费视频| 亚洲AV秘成人久久无码海归| 99热最新国产| 一级特黄录像免费播放下载软件| 极品一线天小嫩嫩真紧| 麻豆md0049免费| 欧美高清无码在线观看| 国产黄色免费电影| 东方AV在线免费观看| 中文字字幕在线中文| 国产视频第一页| 午夜无码高清| 日本在线视频一区二区| 麻豆视频一区| 999免费视频| 欧美午夜网站| 51妺嘿嘿午夜福利| 老熟女一区二区三区| 大香蕉尹在线| 在线超碰| 中日韩欧美一级A片免费| 中文字幕无码av| AV解说| 午夜成人av| 2017人人操| 51成人网站免费| 欧美肏屄视频| 懂色av一区蜜桃| 欧美一级夜夜爽| av天堂手机网| 精品国产久久久久| 九九九网站| 操女人大逼| 97中文字幕在线| 自拍做爱视频| 日日碰日日摸| 日韩中文字幕AV| www.三级| 成人av小说网站| 在线观看免费视频无码| 久久久久中文字幕| 婷婷手机在线| 激情综合婷婷| 十八禁网站在线播放| 免费观看一区| 国产a毛一级,a毛一级| 免费看国产黄色| 囯产精品一区二区三区AV做线| 国产又大又粗又黄| 西西人体大胆裸体A片| 91人人妻人人澡人人爽| 日本成人中文字幕| 大香蕉久久| 插吧插吧综合网| 国产黄色一级电影| 国产在线色| 一级a一级a爰片免费免免中国A片| jzzijzzij亚洲成熟少妇在线观看 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 熟妇人妻丰满久久久久久久无码 | 国产1区在线观看| 亚洲无码中文字幕在线| 欧美国产视频| 久草视频观看| 国产黄色自拍视频| 亚洲精品国产精品乱玛不99| 亚洲无码一区二区三| 大香蕉com| 黄色视频在线网站| 99免费精品视频| 久草天堂| 亚洲人成777| 伊人久久五月| av在线免费观看网址| 天天操夜夜撸| 亚洲综合婷婷| 国偷自产视频一区二区久| 亚洲色图88| 污网站免费观看| 成人国产精品视频| 成人久久久| 免费欧美三级片| 国产精品久久久久久久久久久久久久久久 | av无码在线播放| 农民av| 加勒比一区二区| 日韩精品A片| 久久女女| 国产精品秘久久久久久久久| 九九九九九九国产| 国产18水真多18精品| 天天高清无码| 日韩一级免费视频| 91麻豆免费看| 久久精品人人| 天堂а√在线中文在线新版| 色欲AV在线| 国产热视频| 好男人WWW社区在线视频夜恋 | 91色色网| 日本黄色直播| 天天色天天日天天干| 欧美成人一区二区| 性爱AV网| 成人无码久久| 国产高清不卡| 国产伦子伦一级A片免费看老牛| 久久不射网站| 精品视频国产| 日本一节片在线播放| 一级黄色片免费观看| 日韩欧美精品一区二区| 99热超碰| 操B国产| 亚洲成人AⅤ| 成人自拍偷拍| 午夜成人亚洲| 26uuu国产| 999免费视频| 中文字幕久久播放| 69福利| 成人性爱免费视频| 国产三四区久久| 五月激情婷婷网| 手机av免费| 老女人操逼| 欧产日产国产swag| 视频一区二区三区在线观看| 男人色天堂| 欧美亚洲在线观看| 久久WW| 超碰超爽| 爱爱免费看片| 日本爱爱网站| 三级99| 青青草免费观看视频| 欧美黄色片| 中文字幕乱码中文乱码图片| 人人操久久| 亚洲色在线播放| 国内不卡一卡二视频| 91成人视频在线播放| 欧美精产国品一| 国产毛片777777| 大香蕉A片| 777米奇视频| 免费大黄网站| 日韩一区二区三免费高清在线观看| 亚洲AV无码成人精品区在线欢看| 成人无码区免费AV片| 久草三级片| 日本一区二区三区在线播放| 天天澡天天爽日日AV| 一级二级三级毛片| 五月婷婷在线播放| a亚洲a| 人妻天堂| 18禁裸体美女| 久久综合五月天| 久久偷拍视频| 97AV在线| 黄片av| 黄色小说视频| 丁香五月在线视频| 亚洲成免费| 亚洲国产中文字幕| 欧美老女人逼| 色婷婷色99国产综合精品| wwwxx在线观看| 韩国精品无码| 加勒比无码综合| 牛牛久久| 日本黄色录像| 老太婆擦BBBB撩BBBB| 国产黄色自拍视频| 九九99久久| 影音先锋AV资源在线| 国产视频成人| 一本色道久久综合亚洲二区三区| 少妇搡BBBB搡BBB搡18禁| 青青草精品视频| 天堂AV无码AV| www.91久久| 日韩中文字幕国产| 全国最大成人网站| 欧美操逼在线观看| 99操| 国产伦精品一区二区三区视频女 | a亚洲a| 亚州激情| 国精品无码人妻一区二区三区| 91精品久久香蕉国产线看观看| 吃奶做爱视频| 亚洲最大黄色| 99久re热视频精品98| 天天天天干| 午夜AV在线免费观看| 在线亚洲福利| 在线毛片网站| 影音先锋乱伦电影| 欧美色色色色色色| 香蕉福利网| 国产高清视频在线观看| 91蝌蚪91九色| 蜜桃91精品秘入口| 色婷婷国产精品| 波多野结衣av在线观看窜天猴| 日本无码免费视频| 日本AⅤ中文字幕| 免费的A片| 国产精品视频色| 狠狠躁日日躁夜夜躁A片无码视频 强伦轩一区二区三区四区播放方式 | 安徽妇搡BBBB搡BBBB小说| 日产精品久久久久| 伊人综合久久| AV免费播放| 免费爱爱视频网站| 日韩成人视频在线观看| 尤物网站在线播放| 91精品婷婷国产| 无码三| 天天射网站| 青青草青娱乐| 亚洲无码av在线观看| 免费视频一区二区| 欧洲成人在线观看| jizz在线观看免费视频| 水果派解说在线观看| 中文字幕日韩一级| 91麻豆大奶巨乳一区白虎| 蜜臀精品一区二区三区| 特级西西444www高清大胆免费看 | A片观看视频| 婷婷五月AV| 日韩无码黄色视频| 天天爽天天干| 日本中文视频| 色天堂色男人| 天天操天天干天天射| 亚洲AA视频| 无码高清在线观看| 熟睡侵犯の奶水授乳在线| 一级A片黃色A片| 一级A片免费观看| 三浦恵子一级婬片A片| 五月天婷婷操逼视频| 91露脸熟女四川熟女在线观看 | 国产一级婬片A片免费无成人黑豆| 国产aaaaaaaaaaaaa | 九哥操逼视频| 四川美人搡BBw搡BBw| 久久久精品电影91| 午夜a片| 大地中文资源5页的更新内容| 一道本在线| 亚洲人妻无码一区| 中文字幕精品三区无码| 99在线免费观看视频| 亚洲最大福利视频| 91香蕉视频在线看| 欧美草逼| 欧美日韩免费视频| 日韩欧美黄色片| 国产有码| 中文在线资源| 安微妇搡BBBB搡BBBB日| 精品操逼| 亚洲视频一区二区三区四区娇小视频在线观看视频| 天天夜夜狠狠| 亚洲婷婷在线| 在线看91| 午夜资源站| 天天日天天草| 亚洲无码在线视频播放| 在线国产激情视频| 亚洲任你操超碰在线| 精品人妻一区二区蜜桃视频| 色色综合热| footjobvk| 日本a级视频| 久久熟妇| 午夜大黄片| 三级网站在线播放| 9l视频自拍蝌蚪9l成人| 久久婷婷热| 中文字幕精品无码亚| 人妻av中文字幕| 国产欧美日韩综合在线视频| Av天堂图片在线| 91豆花成人网站| 欧美mv日韩mv国产| 人妻av一区二区三区| 豆花成人视频| 成人黄色视频网站在线观看| 无码一区二区三区免费看| 五月丁香六月| 色视频在线| 91涩| 一级片黑人| 山东wBBBB搡wBBBB| av在线免费观看网址| 91亚洲精华国产精华精华液| 肏逼网| 最新AV在线| 午夜性爱视频| 天天夜夜狠狠| 婷婷综合在线| 狼友无码| 成人黄色电影在线| 成人无码日本动漫电影| 精品国产av| 俺也去也| 狼友自拍| 狠狠操夜夜操| 激情婷婷 | 黃色A片一級二級三級免費久久久| 97国产精品视频| 亚洲小穴| 一级片网址| 中文字字幕中文字幕乱码| 久久美女视频| 特级西西444www大精品| 人妻丰满精品一区二区| 中文字幕免费AV| jizzjizzjizzjizz| av在线免费观看网站| 亚洲色图五月天| 国产人妻人伦精品一区| 一区二区三区在线观看视频| 久久免费国产视频| 午夜免费网站| 一区二区中文字幕| 国产黄色一级片| 亚洲黄色免费在线观看| 69福利视频| 欧美不卡在线观看| 人妻无码HEYZO少妇精品| 江苏妇搡BBBB搡BBB| 午夜激情五月天| 怡春院院成人免费视频| 亚洲色成人中文字幕在线| 东京热在线观看| 亚洲天堂2017| h国产在线| 淫香淫色天天影视| 97色色婷婷五月天| 99热| 无码免费婬AV片在线观看| 老婆中文字幕乱码中文乱码| 日韩久久精品视频| 亚洲内射网| 99热在线播放| 无码精品人妻一区二区三刘亦菲| 久久涩| 2025无码视频| 日韩在线视频二区| 国产在线在线| 五月久久婷婷| 成人在线国产| 亚洲日韩欧美一区二区天天天| 天天日天天干美女| 狠狠操夜夜操| 午夜精品18视频国产17c| 欧美日韩国产一区二区三区| 国产精品无码天天爽视频| 性爱AV天堂| AV无码一区| 午夜大黄片| 操逼片| 广东BBW搡BBBB搡| 午夜成人无码| 色情一级AA片免费观看| 国产一级a免一级a免费| 日韩免费在线观看| 女人卖婬视频播放| 天天干天天添| www.一区二区三区| 激情无码一区二区| AAA日韩| 蝌蚪窝在线视频观看| 天天爽天天做| 亚洲精品无码在线观看| 亚洲精品AⅤ一区二| 日本精品无码a62v在线| 在线国产中文字幕| 韩国成人精品三级| 黄色免费视频网站| 大香蕉伊人影视| 老司机永久免费91| 狠狠躁日日躁夜夜躁A片无码视频| 欧美中文字幕在线视频| 日本高清无码视频| 婷婷五月开心五月| 亚洲无码av中文字幕| 成人国产无码| 欧美日韩AV| 男人天堂AV片| 91乱伦视频| 久久国产av| 亚洲中文字幕视频在线观看| 国产精品视频网站| 精品一区二区三区四区五区六区| 日韩视频中文字幕在线| 欧美日韩亚洲一区二区三区| 操逼AⅤ| 大乳奶一级婬片A片| 亚洲一级黄| 少妇搡BBBB搡BBB搡造水爽| 一区二区水蜜桃| 国产欧美在线看| 国产激情视频网站| 高潮国产| 亚洲无码免费在线视频| 一区二区高清无码视频| 91熊猫视频| 青春草视频| 日韩精品区| 国产成人精品一区二区三区在线 | 欧美日韩免费在线| 另类老妇性BBwBBw图片| 日韩中字幕无码| 成人黄网站在线观看| 亚洲视频网址| 色色色成人视频| 超级碰碰碰碰碰碰碰碰碰| 91AV在线播放| 成人午夜免费视频| 无码一区二区免费| 蜜桃秘av一区二区三区安全| 国产一区二区成人久久919色| 日本无码在线视频| 日韩无码高清一区| 在线免费观看a| 免费伊人大香蕉| 亚洲热在线视频| 奇米av在线| 精品国产一级A片黄毛网站| 尤物综合网| 中文字幕乱码亚洲无线码按摩| 做爱激情视频网站| 久草视频在线播放| 伊人网在线播放| 国产成人a| 日韩一区二区三区在线| 国产青青| 天天操夜夜操狠狠操| 亚洲色图一区二区三区| 久久久久性爱| 手机av免费| 色欲综合网| 婷婷深爱五月| 91视频中文字幕| 超碰97av| 日韩无码高清一区| 成人免费黄色视频| 成人午夜精品无码区| 男人天堂视频网站| 少妇精品久久久久久久久久| 亚洲福利免费观看| 丁香婷婷综合网| 秋霞丝鲁片一区二区三区手机在绒免 | 91亚洲在线| 亚洲在线无码视频| 人人妻人人色| 五月婷婷丁香综合| 在线中文无码| 亚洲色图一区二区三区| 操网站| 99九九久久| 91探花视频| 日韩免费黄色电影| www天天干| 一级片欧美| 一本高清无码| 日本爱爱小视频| 人人干人人干人人| 韩国无码一区二区三区| 色色丁香| 亚洲第一页在线观看| 色呦呦中文字幕| 麻豆国产在线| 黄色福利视频在线观看| 中文字幕成人影片| 黄色成人免费视频| 国产美女一区| 成人不卡视频| 99精品视频16在线免费观看| 色色色热| 亚洲一区二区三区在线视频| a毛片| 在线观看中文字幕AV| 一二三区免费视频| 热久久这里只有精品| 麻豆久久久久| 情侣av| 淫淫五月天| 91美女视频| 天堂无码在线| 无码三级在线观看| 激情网页| 国精产品秘一区二区-| 大香蕉99| 逼逼AV网站-日韩电影| 久久久久亚洲AV成人片| 亚洲第一色在线| 无码日逼视频| 欧美三级不卡| 青青操色| 国产一级片无码| 免费成人视频在线观看| 国产在线一| 精品乱子伦一区二区三区在线播放| 亚洲免费观看高清完整版| 逼特逼视频在线| 亚洲三级片在线| 一区二区三区黄色| 婷婷色小说| 黄色三级在线观看| 波多野结衣视频网站| 91免费在线视频| 色999在线播放视频| 四虎激情影院| 狠狠色噜噜狠狠狠7777米奇网| 青青久久91| 丁香六月色| 特黄色视频| 午夜69成人做爱视频网站| 性爱视频免费| 无码人妻系列| 成人无码网站| 亚洲热视频| 亚洲高清无码在线观看| 91熊猫视频| 亚洲第一综合网| 91逼| 国产一区二区视频在线| 国产l精品久久久久久久久久| 国产第56页| 日本成人一区二区三区| AV色天堂| 国产精品久久久久精| 色网站在线观看| 羽月希无码| 口爆在线观看| 国产你懂的| 日韩AV三级片| 日韩无码中文字| 成人精品一区日本无码网站suv/| 熟女人妻一区二区| 欧美日韩大片| 欧美不卡一区二区三区| 欧美日韩精品久久久免费观看| 青青操在线观看| 成人在线观看AV| 色五月婷婷丁香五月| 欧美系列在线| 国产一区一区| www.日本黄色视频| 日韩在线观看一区| 欧美午夜福利视频| 久久九九99| 免费观看高清无码视频| 波多野结衣福利视频| 久久大香蕉网| 久久精品毛片| 特级西西44www无码| 亚洲一级Av无码毛片久久精品| 丁香六月婷婷| 亚洲小电影在线观看| 久9久9久9久9久9久9| 国产1区2区3区中文字幕| 国产在线视频91| 人人澡人人爽人人精品| 壹屌探花| 三洞齐开Av在线免费观看| 一级片三级片| 丁香五月天激情视频| 欧美A在线观看| 成人亚洲A片V一区二区三区蜜月| 97人人爽| 成人无码视频| 久久久久久久三级片| 2020无码| 中字无码制服| 午夜蜜桃人妻一区二区| 日韩爱爱视频| 日韩性爱网站| AV在线播放中文字幕| 国产无码电影在线观看| 欧美性爱视频免费观看| 欧美一级特黄A片免费看| 二区视频| 特级丰满少妇免费观看| 伊人网视频在线播放| 国内精品久久久久久久久久变脸 | 亚洲秘无码一区二区三区欧美| 人人爽网站| 日韩视频二区| 日韩中文字幕无码中字字幕| 人人干人人操人人摸| 国产精品一区在线观看| 亚洲夜夜爱| 男人午夜网站| 亚洲精品视频免费观看| 亚洲精品在线看| 亚洲国产精品视频| 天天精品无码| 国产www视频| 高清无码视频18| 欧亚av| 婷婷激情五月| 91精品国产一区二区三区四区大| 日本韩国欧美18| 亚洲无码在线视频播放| 先锋资源av| 大香蕉精品欧美色综合2025| 水多多成人免费A片| 欧美日韩中文字幕在线视频| av资源网站| 青娱乐国产| 国产AAA片| 四季AV之日韩人妻无码| 另类老太婆性BBWBBw| 国产无码激情视频| 日本黄色影视| 欧美精品成人网站| 黄色高清无码视频| 国内精品久久久| 人妻在线你懂的| 69性影院| 香蕉视频毛片| 亚洲无码小电影| 亚洲操逼视频| 香蕉成人网站在线观看| 特色毛片| 久99| 亚洲成人自拍| 欧洲无码一区二区三区| 婷婷操逼网| 欧美一道本| 超碰91在线| 无码观看视频| 一级a免一级a做免费线看内裤的注意事项 | 国产97视频| 先锋影音亚洲AV每日资源网站| 大香蕉最新视频| 国产成人高清无码| 中文字幕综合网| 欧美日韩亚洲一区二区三区| 99热免费精品| 在线看黄网站| 久久91久久久久麻豆精品| 韩国一级AV| 欧美a片在线观看| 91天堂| 在线操B视频| 欧美熟妇搡BBBB搡BBBBB| 2019天天干| 好吊视频一区二区三区| 国产超级无码高清在线视频观看| 青青草原黄色视频| 国产免费成人视频| 亚洲AV秘一区二区色盗战流出 | 夜夜嗨av| 懂色AV| 亚洲国产成人视频| 日本熟妇高潮BBwBBwBBw| 操逼操逼操逼| 一牛影视精品av| 久操青青| 乌克兰毛片| 久久日av| 久久精品导航| 亚洲无码99| 色妞一區| 成人自拍视频在线| 视频二区中文字幕| 色婷婷丁香五月| 精品国产精品三级精品AV网址| 午夜爽爽爽| 免费看一区二区三区A片| 91视频福利网| 嫩BBB| www.伊人| 蜜柚Av| 少妇高潮喷水| 西西人体WW大胆无码| 国产高清在线免费观看AV片| 国外成人性视频免费| 91无码电影| 摸BBB槡BBBB搡BBB,,,,,| 无码中文在线| 伊人91| 久久人人网| 91香蕉在线视频| 激情网五月天| 成人午夜A片免费看| 人人爽人人操人人| 亚洲国产婷婷| 亚洲影音先锋资源| 91一级特黄大片| 国产精品一二三区| 激情开心站| 欧美日色| 黄色视频在线观看18| 欧美老妇另类BBwBBw| 综合一区二区三区| 天天干天天日天天操| 亚洲婷婷在线视频| 一级在线| 精品黄色毛片| 色天天干| 国产又爽又黄免费网站校园里| 午夜神马51| 一道本无码在线视频| 伊人干综合| 少妇高潮一区二区三区99| 天堂在线www| 在线免费观看黄片| 国产精品久久久大香蕉| 亚洲中午字幕| 人人操人人超碰| 日韩一级片免费观看| 影音先锋成人AV| 日韩一区二区三区四区久久久精品有吗| 亚洲涩情91日韩一区二区| 高颜值呻吟给力| 青青草原在线视频免费观看| 高清无码在线免费| 亚洲一区日韩| 亚洲天堂日本| 国产美女裸体网站| 午夜专区| 99热7| 日韩精品成人AV| 国产卡一卡二| 成人视频免费在线观看| 国产又爽又黄视频| 另类老妇videos另类| 人人操人人爽人人爱| 俺去俺来也www色官网黑人| av女人天堂| 亚洲AV女人18毛片水真多| 西西4444www大胆无| 在线看V片| 亚洲理伦| 思思久久高颜值|