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

Spring Boot 實現(xiàn)各種參數(shù)校驗,寫得太好了,建議收藏!

共 7811字,需瀏覽 16分鐘

 ·

2021-12-14 17:08


來源:juejin.im/post/
6856541106626363399

  • 簡單使用
    • 引入依賴
    • requestBody參數(shù)校驗
    • requestParam/PathVariable參數(shù)校驗
    • 統(tǒng)一異常處理
  • 進階使用
    • 分組校驗
    • 嵌套校驗
    • 集合校驗
    • 自定義校驗
    • 編程式校驗
    • 快速失?。‵ail Fast)
    • @Valid和@Validated區(qū)別
  • 實現(xiàn)原理
    • requestBody參數(shù)校驗實現(xiàn)原理
    • 方法級別的參數(shù)校驗實現(xiàn)原理

之前也寫過一篇關于Spring Validation使用的文章,不過自我感覺還是浮于表面,本次打算徹底搞懂Spring Validation。本文會詳細介紹Spring Validation各種場景下的最佳實踐及其實現(xiàn)原理,死磕到底!

項目源碼:https://github.com/chentianming11/spring-validation

簡單使用

Java API規(guī)范(JSR303)定義了Bean校驗的標準validation-api,但沒有提供實現(xiàn)。hibernate validation是對這個規(guī)范的實現(xiàn),并增加了校驗注解如@Email、@Length等。

Spring Validation是對hibernate validation的二次封裝,用于支持spring mvc參數(shù)自動校驗。接下來,我們以spring-boot項目為例,介紹Spring Validation的使用。

引入依賴

如果spring-boot版本小于2.3.x,spring-boot-starter-web會自動傳入hibernate-validator依賴。如果spring-boot版本大于2.3.x,則需要手動引入依賴:

<dependency>
????<groupId>org.hibernategroupId>
????<artifactId>hibernate-validatorartifactId>
????<version>6.0.1.Finalversion>
dependency>

對于web服務來說,為防止非法參數(shù)對業(yè)務造成影響,在Controller層一定要做參數(shù)校驗的!大部分情況下,請求參數(shù)分為如下兩種形式:

  • POST、PUT請求,使用requestBody傳遞參數(shù);
  • GET請求,使用requestParam/PathVariable傳遞參數(shù)。

下面我們簡單介紹下requestBody和requestParam/PathVariable的參數(shù)校驗實戰(zhàn)!

requestBody參數(shù)校驗

POST、PUT請求一般會使用requestBody傳遞參數(shù),這種情況下,后端使用DTO對象進行接收。只要給DTO對象加上@Validated注解就能實現(xiàn)自動參數(shù)校驗。比如,有一個保存User的接口,要求userName長度是2-10,account和password字段長度是6-20。

如果校驗失敗,會拋出MethodArgumentNotValidException異常,Spring默認會將其轉為400(Bad Request)請求。

DTO表示數(shù)據(jù)傳輸對象(Data Transfer Object),用于服務器和客戶端之間交互傳輸使用的。在spring-web項目中可以表示用于接收請求參數(shù)的Bean對象。

在DTO字段上聲明約束注解

@Data
public?class?UserDTO?{

????private?Long?userId;

????@NotNull
????@Length(min?=?2,?max?=?10)
????private?String?userName;

????@NotNull
????@Length(min?=?6,?max?=?20)
????private?String?account;

????@NotNull
????@Length(min?=?6,?max?=?20)
????private?String?password;
}

在方法參數(shù)上聲明校驗注解

@PostMapping("/save")
public?Result?saveUser(@RequestBody?@Validated?UserDTO?userDTO)?{
????//?校驗通過,才會執(zhí)行業(yè)務邏輯處理
????return?Result.ok();
}

這種情況下,使用@Valid和@Validated都可以。

requestParam/PathVariable參數(shù)校驗

GET請求一般會使用requestParam/PathVariable傳參。如果參數(shù)比較多(比如超過6個),還是推薦使用DTO對象接收。

否則,推薦將一個個參數(shù)平鋪到方法入參中。在這種情況下,必須在Controller類上標注@Validated注解,并在入參上聲明約束注解(如@Min等)。如果校驗失敗,會拋出ConstraintViolationException異常。

代碼示例如下:

@RequestMapping("/api/user")
@RestController
@Validated
public?class?UserController?{
????//?路徑變量
????@GetMapping("{userId}")
????public?Result?detail(@PathVariable("userId")?@Min(10000000000000000L)?Long?userId)?{
????????//?校驗通過,才會執(zhí)行業(yè)務邏輯處理
????????UserDTO?userDTO?=?new?UserDTO();
????????userDTO.setUserId(userId);
????????userDTO.setAccount("11111111111111111");
????????userDTO.setUserName("xixi");
????????userDTO.setAccount("11111111111111111");
????????return?Result.ok(userDTO);
????}

????//?查詢參數(shù)
????@GetMapping("getByAccount")
????public?Result?getByAccount(@Length(min?=?6,?max?=?20)?@NotNull?String??account)?{
????????//?校驗通過,才會執(zhí)行業(yè)務邏輯處理
????????UserDTO?userDTO?=?new?UserDTO();
????????userDTO.setUserId(10000000000000003L);
????????userDTO.setAccount(account);
????????userDTO.setUserName("xixi");
????????userDTO.setAccount("11111111111111111");
????????return?Result.ok(userDTO);
????}
}

統(tǒng)一異常處理

前面說過,如果校驗失敗,會拋出MethodArgumentNotValidException或者ConstraintViolationException異常。在實際項目開發(fā)中,通常會用統(tǒng)一異常處理來返回一個更友好的提示。

比如我們系統(tǒng)要求無論發(fā)送什么異常,http的狀態(tài)碼必須返回200,由業(yè)務碼去區(qū)分系統(tǒng)的異常情況。

@RestControllerAdvice
public?class?CommonExceptionHandler?{

????@ExceptionHandler({MethodArgumentNotValidException.class})
????@ResponseStatus(HttpStatus.OK)
????@ResponseBody
????public?Result?handleMethodArgumentNotValidException(MethodArgumentNotValidException?ex)?
{
????????BindingResult?bindingResult?=?ex.getBindingResult();
????????StringBuilder?sb?=?new?StringBuilder("校驗失敗:");
????????for?(FieldError?fieldError?:?bindingResult.getFieldErrors())?{
????????????sb.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append(",?");
????????}
????????String?msg?=?sb.toString();
???????return?Result.fail(BusinessCode.參數(shù)校驗失敗,?msg);
????}

????@ExceptionHandler({ConstraintViolationException.class})
????@ResponseStatus(HttpStatus.OK)
????@ResponseBody
????public?Result?handleConstraintViolationException(ConstraintViolationException?ex)?
{
????????return?Result.fail(BusinessCode.參數(shù)校驗失敗,?ex.getMessage());
????}
}

推薦下自己做的 Spring Boot 的實戰(zhàn)項目:

https://github.com/YunaiV/ruoyi-vue-pro

進階使用

分組校驗

在實際項目中,可能多個方法需要使用同一個DTO類來接收參數(shù),而不同方法的校驗規(guī)則很可能是不一樣的。這個時候,簡單地在DTO類的字段上加約束注解無法解決這個問題。因此,spring-validation支持了分組校驗的功能,專門用來解決這類問題。

還是上面的例子,比如保存User的時候,UserId是可空的,但是更新User的時候,UserId的值必須>=10000000000000000L;其它字段的校驗規(guī)則在兩種情況下一樣。這個時候使用分組校驗的代碼示例如下:

約束注解上聲明適用的分組信息groups

@Data
public?class?UserDTO?{

????@Min(value?=?10000000000000000L,?groups?=?Update.class)
????private?Long?userId
;

????@NotNull(groups?=?{Save.class,?Update.class})
????@Length(min?
=?2,?max?=?10,?groups?=?{Save.class,?Update.class})
????private?String?userName
;

????@NotNull(groups?=?{Save.class,?Update.class})
????@Length(min?
=?6,?max?=?20,?groups?=?{Save.class,?Update.class})
????private?String?account
;

????@NotNull(groups?=?{Save.class,?Update.class})
????@Length(min?
=?6,?max?=?20,?groups?=?{Save.class,?Update.class})
????private?String?password
;

????/**
?????*?保存的時候校驗分組
?????*/

????public?interface?Save?{
????}

????/**
?????*?更新的時候校驗分組
?????*/

????public?interface?Update?{
????}
}

@Validated注解上指定校驗分組

@PostMapping("/save")
public?Result?saveUser(@RequestBody?@Validated(UserDTO.Save.class)?UserDTO?userDTO)?{
????//?校驗通過,才會執(zhí)行業(yè)務邏輯處理
????return?Result.ok();
}

@PostMapping("/update")
public?Result?updateUser(@RequestBody?@Validated(UserDTO.Update.class)?UserDTO?userDTO)?{
????//?校驗通過,才會執(zhí)行業(yè)務邏輯處理
????return?Result.ok();
}

嵌套校驗

前面的示例中,DTO類里面的字段都是基本數(shù)據(jù)類型和String類型。但是實際場景中,有可能某個字段也是一個對象,這種情況先,可以使用嵌套校驗。

比如,上面保存User信息的時候同時還帶有Job信息。需要注意的是,此時DTO類的對應字段必須標記@Valid注解。

@Data
public?class?UserDTO?{

????@Min(value?=?10000000000000000L,?groups?=?Update.class)
????private?Long?userId
;

????@NotNull(groups?=?{Save.class,?Update.class})
????@Length(min?
=?2,?max?=?10,?groups?=?{Save.class,?Update.class})
????private?String?userName
;

????@NotNull(groups?=?{Save.class,?Update.class})
????@Length(min?
=?6,?max?=?20,?groups?=?{Save.class,?Update.class})
????private?String?account
;

????@NotNull(groups?=?{Save.class,?Update.class})
????@Length(min?
=?6,?max?=?20,?groups?=?{Save.class,?Update.class})
????private?String?password
;

????@NotNull(groups?=?{Save.class,?Update.class})
????@Valid
????private?Job?job
;

????@Data
????public?static?class?Job?{

????????@Min(value?=?1,?groups?=?Update.class)
????????private?Long?jobId
;

????????@NotNull(groups?=?{Save.class,?Update.class})
????????@Length(min?
=?2,?max?=?10,?groups?=?{Save.class,?Update.class})
????????private?String?jobName
;

????????@NotNull(groups?=?{Save.class,?Update.class})
????????@Length(min?
=?2,?max?=?10,?groups?=?{Save.class,?Update.class})
????????private?String?position
;
????}

????/**
?????*?保存的時候校驗分組
?????*/

????public?interface?Save?{
????}

????/**
?????*?更新的時候校驗分組
?????*/

????public?interface?Update?{
????}
}

嵌套校驗可以結合分組校驗一起使用。還有就是嵌套集合校驗會對集合里面的每一項都進行校驗,例如List字段會對這個list里面的每一個Job對象都進行校驗

集合校驗

如果請求體直接傳遞了json數(shù)組給后臺,并希望對數(shù)組中的每一項都進行參數(shù)校驗。此時,如果我們直接使用java.util.Collection下的list或者set來接收數(shù)據(jù),參數(shù)校驗并不會生效!我們可以使用自定義list集合來接收參數(shù):

包裝List類型,并聲明@Valid注解

public?class?ValidationList<E>?implements?List<E>?{

????@Delegate?//?@Delegate是lombok注解
????@Valid?//?一定要加@Valid注解
????public?List?list?=?new?ArrayList<>();

????//?一定要記得重寫toString方法
????@Override
????public?String?toString()?{
????????return?list.toString();
????}
}

@Delegate注解受lombok版本限制,1.18.6以上版本可支持。如果校驗不通過,會拋出NotReadablePropertyException,同樣可以使用統(tǒng)一異常進行處理。

比如,我們需要一次性保存多個User對象,Controller層的方法可以這么寫:

@PostMapping("/saveList")
public?Result?saveList(@RequestBody?@Validated(UserDTO.Save.class)?ValidationList?userList)?{
????//?校驗通過,才會執(zhí)行業(yè)務邏輯處理
????return?Result.ok();
}

自定義校驗

業(yè)務需求總是比框架提供的這些簡單校驗要復雜的多,我們可以自定義校驗來滿足我們的需求。

自定義spring validation非常簡單,假設我們自定義加密id(由數(shù)字或者a-f的字母組成,32-256長度)校驗,主要分為兩步:

自定義約束注解

@Target({METHOD,?FIELD,?ANNOTATION_TYPE,?CONSTRUCTOR,?PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy?=?{EncryptIdValidator.class})
public?@interface?EncryptId?
{

????//?默認錯誤消息
????String?message()?default?"加密id格式錯誤";

????//?分組
????Class[]?groups()?default?{};

????//?負載
????Class[]?payload()?default?{};
}

實現(xiàn)ConstraintValidator接口編寫約束校驗器

public?class?EncryptIdValidator?implements?ConstraintValidator<EncryptId,?String>?{

????private?static?final?Pattern?PATTERN?=?Pattern.compile("^[a-f\\d]{32,256}$");

????@Override
????public?boolean?isValid(String?value,?ConstraintValidatorContext?context)?{
????????//?不為null才進行校驗
????????if?(value?!=?null)?{
????????????Matcher?matcher?=?PATTERN.matcher(value);
????????????return?matcher.find();
????????}
????????return?true;
????}
}

這樣我們就可以使用@EncryptId進行參數(shù)校驗了!

編程式校驗

上面的示例都是基于注解來實現(xiàn)自動校驗的,在某些情況下,我們可能希望以編程方式調用驗證。這個時候可以注入javax.validation.Validator對象,然后再調用其api。

@Autowired
private?javax.validation.Validator?globalValidator;

//?編程式校驗
@PostMapping("/saveWithCodingValidate")
public?Result?saveWithCodingValidate(@RequestBody?UserDTO?userDTO)?{
????Set>?validate?=?globalValidator.validate(userDTO,?UserDTO.Save.class);
????//?如果校驗通過,validate為空;否則,validate包含未校驗通過項
????if?(validate.isEmpty())?{
????????//?校驗通過,才會執(zhí)行業(yè)務邏輯處理

????}?else?{
????????for?(ConstraintViolation?userDTOConstraintViolation?:?validate)?{
????????????//?校驗失敗,做其它邏輯
????????????System.out.println(userDTOConstraintViolation);
????????}
????}
????return?Result.ok();
}

快速失敗(Fail Fast)

Spring Validation默認會校驗完所有字段,然后才拋出異常。可以通過一些簡單的配置,開啟Fali Fast模式,一旦校驗失敗就立即返回。

@Bean
public?Validator?validator()?{
????ValidatorFactory?validatorFactory?=?Validation.byProvider(HibernateValidator.class)
????????????.configure()
????????????//?快速失敗模式
????????????.failFast(true)
????????????.buildValidatorFactory()
;
????return?validatorFactory.getValidator();
}

@Valid和@Validated區(qū)別

推薦下自己做的 Spring Cloud 的實戰(zhàn)項目:

https://github.com/YunaiV/onemall

實現(xiàn)原理

requestBody參數(shù)校驗實現(xiàn)原理

在spring-mvc中,RequestResponseBodyMethodProcessor是用于解析@RequestBody標注的參數(shù)以及處理@ResponseBody標注方法的返回值的。顯然,執(zhí)行參數(shù)校驗的邏輯肯定就在解析參數(shù)的方法resolveArgument()中:

public?class?RequestResponseBodyMethodProcessor?extends?AbstractMessageConverterMethodProcessor?{
????@Override
????public?Object?resolveArgument(MethodParameter?parameter,?@Nullable?ModelAndViewContainer?mavContainer,
??????????????????????????????????NativeWebRequest?webRequest,?@Nullable?WebDataBinderFactory?binderFactory)
?throws?Exception?
{

????????parameter?=?parameter.nestedIfOptional();
????????//將請求數(shù)據(jù)封裝到DTO對象中
????????Object?arg?=?readWithMessageConverters(webRequest,?parameter,?parameter.getNestedGenericParameterType());
????????String?name?=?Conventions.getVariableNameForParameter(parameter);

????????if?(binderFactory?!=?null)?{
????????????WebDataBinder?binder?=?binderFactory.createBinder(webRequest,?arg,?name);
????????????if?(arg?!=?null)?{
????????????????//?執(zhí)行數(shù)據(jù)校驗
????????????????validateIfApplicable(binder,?parameter);
????????????????if?(binder.getBindingResult().hasErrors()?&&?isBindExceptionRequired(binder,?parameter))?{
????????????????????throw?new?MethodArgumentNotValidException(parameter,?binder.getBindingResult());
????????????????}
????????????}
????????????if?(mavContainer?!=?null)?{
????????????????mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX?+?name,?binder.getBindingResult());
????????????}
????????}
????????return?adaptArgumentIfNecessary(arg,?parameter);
????}
}

可以看到,resolveArgument()調用了validateIfApplicable()進行參數(shù)校驗。

protected?void?validateIfApplicable(WebDataBinder?binder,?MethodParameter?parameter)?{
????//?獲取參數(shù)注解,比如@RequestBody、@Valid、@Validated
????Annotation[]?annotations?=?parameter.getParameterAnnotations();
????for?(Annotation?ann?:?annotations)?{
????????//?先嘗試獲取@Validated注解
????????Validated?validatedAnn?=?AnnotationUtils.getAnnotation(ann,?Validated.class);
????????//如果直接標注了@Validated,那么直接開啟校驗。
????????//如果沒有,那么判斷參數(shù)前是否有Valid起頭的注解。
????????if?(validatedAnn?!=?null?||?ann.annotationType().getSimpleName().startsWith("Valid"))?{
????????????Object?hints?=?(validatedAnn?!=?null???validatedAnn.value()?:?AnnotationUtils.getValue(ann));
????????????Object[]?validationHints?=?(hints?instanceof?Object[]???(Object[])?hints?:?new?Object[]?{hints});
????????????//執(zhí)行校驗
????????????binder.validate(validationHints);
????????????break;
????????}
????}
}

看到這里,大家應該能明白為什么這種場景下@Validated、@Valid兩個注解可以混用。我們接下來繼續(xù)看WebDataBinder.validate()實現(xiàn)。

@Override
public?void?validate(Object?target,?Errors?errors,?Object...?validationHints)?{
????if?(this.targetValidator?!=?null)?{
????????processConstraintViolations(
????????????//此處調用Hibernate?Validator執(zhí)行真正的校驗
????????????this.targetValidator.validate(target,?asValidationGroups(validationHints)),?errors);
????}
}

最終發(fā)現(xiàn)底層最終還是調用了Hibernate Validator進行真正的校驗處理。

方法級別的參數(shù)校驗實現(xiàn)原理

上面提到的將參數(shù)一個個平鋪到方法參數(shù)中,然后在每個參數(shù)前面聲明約束注解的校驗方式,就是方法級別的參數(shù)校驗。

實際上,這種方式可用于任何Spring Bean的方法上,比如Controller/Service等。其底層實現(xiàn)原理就是AOP,具體來說是通過MethodValidationPostProcessor動態(tài)注冊AOP切面,然后使用MethodValidationInterceptor對切點方法織入增強。

public?class?MethodValidationPostProcessor?extends?AbstractBeanFactoryAwareAdvisingPostProcessorimplements?InitializingBean?{
????@Override
????public?void?afterPropertiesSet()?{
????????//為所有`@Validated`標注的Bean創(chuàng)建切面
????????Pointcut?pointcut?=?new?AnnotationMatchingPointcut(this.validatedAnnotationType,?true);
????????//創(chuàng)建Advisor進行增強
????????this.advisor?=?new?DefaultPointcutAdvisor(pointcut,?createMethodValidationAdvice(this.validator));
????}

????//創(chuàng)建Advice,本質就是一個方法攔截器
????protected?Advice?createMethodValidationAdvice(@Nullable?Validator?validator)?{
????????return?(validator?!=?null???new?MethodValidationInterceptor(validator)?:?new?MethodValidationInterceptor());
????}
}

接著看一下MethodValidationInterceptor:

public?class?MethodValidationInterceptor?implements?MethodInterceptor?{
????@Override
????public?Object?invoke(MethodInvocation?invocation)?throws?Throwable?{
????????//無需增強的方法,直接跳過
????????if?(isFactoryBeanMetadataMethod(invocation.getMethod()))?{
????????????return?invocation.proceed();
????????}
????????//獲取分組信息
????????Class[]?groups?=?determineValidationGroups(invocation);
????????ExecutableValidator?execVal?=?this.validator.forExecutables();
????????Method?methodToValidate?=?invocation.getMethod();
????????Set>?result;
????????try?{
????????????//方法入參校驗,最終還是委托給Hibernate?Validator來校驗
????????????result?=?execVal.validateParameters(
????????????????invocation.getThis(),?methodToValidate,?invocation.getArguments(),?groups);
????????}
????????catch?(IllegalArgumentException?ex)?{
????????????...
????????}
????????//有異常直接拋出
????????if?(!result.isEmpty())?{
????????????throw?new?ConstraintViolationException(result);
????????}
????????//真正的方法調用
????????Object?returnValue?=?invocation.proceed();
????????//對返回值做校驗,最終還是委托給Hibernate?Validator來校驗
????????result?=?execVal.validateReturnValue(invocation.getThis(),?methodToValidate,?returnValue,?groups);
????????//有異常直接拋出
????????if?(!result.isEmpty())?{
????????????throw?new?ConstraintViolationException(result);
????????}
????????return?returnValue;
????}
}

實際上,不管是requestBody參數(shù)校驗還是方法級別的校驗,最終都是調用Hibernate Validator執(zhí)行校驗,Spring Validation只是做了一層封裝。


瀏覽 52
點贊
評論
收藏
分享

手機掃一掃分享

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

手機掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩中文字幕一区| 日韩视频成人| 色玖玖| 五月婷婷六月激情| 微拍福利一区| 青草久久视频| 韩国成人精品三级| 11一12周岁女毛片| 好爽~要尿了~要喷了~同桌 | 人人干人人色| 国产在线拍揄自揄拍无码网站新闻| 成人黄色性爱视频| 亚洲免费人妻| 黄页免费无码| 日本久久婷婷| 巨乳国产一区| 秋霞午夜福利| 日本A∨| 韩国精品一区二区三区| 欧美伊人在线| 大香蕉天天操| 国产精品国产精品国产专区不52| 一级一级a免一级a做免费线看内裤 | 久草视频免费在线观看| 欧美精品在线播放| 欧美三级电影在线观看| 午夜AV在线观看| 99精品视频16在线免费观看| 国产色悠悠| 97人操| 97福利导航| 黃色A片一級二級三級免費久久久 亚洲AV无码第一区二区三区蜜桃 亚洲综合免费观看高清完整版在线 | 免费毛片网| 五月婷婷激情综合| 大鸡巴免费视频| 操逼视频电影| 国产超碰青青草| 色婷婷香蕉在线一区二区| 麻豆视频在线看| 国产成人宗合| 1插菊花综合网| 成人激情在线| 国产精品你懂的| 99re在线观看视频| 日韩三级在线观看| 能看的AV网站| 岛国无码av| 久草不卡| yw尤物视频| 另类老妇极品BBWBBw| 亚洲无码高清免费| 成人国产无码| 亚洲激情综合视频| 黄色a在线| 亚洲影音先锋资源| 久久久www| 天天操天天干欧美精品| 日本黄色免费网站| 亚洲无码偷拍| 激情视频网站| 西西人体WW大胆无码| 亚洲综合免费观看高清| 日韩免费在线观看视频| 无码不卡在线观看| 粉嫩av懂色av蜜臀av分享| 久久婷婷综合网| 日韩三级av| 天天干无码| 日韩免费小视频| 超碰97老师| 九一成人电影| 在线观看免费一区| 国产21区| 国产精品每日更新| 午夜激情久久| 日本AA片视频| 91精品国产一区二区三区| 波多野结衣av在线观看| 中文字幕无码观看| 乱伦乱码| 嫩BBB槡BBBB槡BBBB百度| 成人午夜婬片A片| 国产精品自拍在线观看| 日本中文字幕在线观看视频| www日本在线| 台湾中文字幕网| AV中文无码| 牛牛aV| 亚洲乱伦av| 一级内射片在线网站观看| 五月丁香婷婷在线观看| 超碰人人人人人人人人| 亚洲高清视频在线播放| 欧美久久一区| A片啪啪| 亚洲成人电影无码| 日韩无码免费电影| 日韩免费小视频| 中文在线一区| 亚洲视频在线视频| 日韩三级av| 久久综合伊人777777| 一级片av| 国产7777| 国产九九九九| 亚洲激情婷婷| 黄色大片在线免费观看| 亚洲骚妇| 黄片视频免费| 丝袜足交视频在线观看| 欧美黄色操逼| 日韩无码中文字| 亚洲AV永久无码国产精品久久| 成年人免费网站| 日逼| av久操| 在线免费观看a| 无码无遮挡| 中文字幕在线国产| 777无码| 人人干人人操人人摸| 日日夜夜av| 搡BBBB搡BBB搡我瞎了| 亚洲三级片在线播放| 免费在线观看黄色视频网站| 人人操人人射| 五月色综合网| 黄片中文| 伊人激情五月| 久久久久久久久久成人| 久久久高清无码| 午夜福利爱爱视频| 高清无码做爱视频| 自拍AV在线| 国产a√| 亚洲AⅤ| 亚洲无码一级电影| 51成人免费| 手机看片1024久久| 俄罗斯老熟妇与子伦| 视频你懂的| A片免费观看视频| 人成视频在线| 国产三级自拍视频| 超碰av在线| 成人a级网站| 日韩欧美国产黄色电影| 亚洲免费观看高清完整| 久久久久久久免费无码| 国产精品秘久久久久久| 亚洲天码中字| 影音先锋日韩资源| 北条麻妃在线无码| AV青草| 五月丁香色色网| 婷婷五月综合中文字幕| 国产精品成人免费视频| 在线成人av| 午夜高清无码| 精品九九| 在线操B视频| 中文在线第一页| 色色激情网| 日本一区二区三区在线观看网站 | 黄色A片电影| 奇米色五月| 偷拍一区二区| 国产熟妇码视频黑料| 996视频| 中文字幕一级片| 99操99| 亚洲AV无码永久精品| 呦小BBBB小小BBBB| 日本成人中文字幕| 欧美在线不卡综合| 无码999| 在线观看亚洲中文字幕| 在线免费观看无码视频| 亚洲A级片| 加勒比综合在线| gogogo高清在线完整免费播放韩国 | 亚洲精品mv| 性爱xxxxx| 日韩久久高清| 中文字幕第315页| 人妻日韩| 搞黄免费视频视频| 黄一区二区| 色噜噜人妻av中文字幕| 翔田千里無碼破解| 图片区视频区小说区| 亚洲天堂在线视频| 国产黄色片免费| 黄页av| 色拍拍视频| 悠悠色影院| 中文字幕的色| 久久国产2025| 久久精品一区二区三区不卡牛牛 | 91成人在线播放| 操逼五月天| 影音先锋资源| 四色五月婷婷| 国产成人影视在线观看| 日本亚洲黄色视频| 天天操综合网| 亚洲伦理一区二区| www.久热| 色丁香婷婷| 人人看人人摸人人操| 国产精品色婷婷99久久精品| 夜夜骚精品人妻av一区| 尤物av在线| 100国产精品人妻无码| 欧美精品一级片| 日皮免费视频| 一级A片视频免费看| 日韩无码a| 久久精品视频9| 美女黄色视频网站| 国产AV高清| 翔田千里av在线| 亚洲插菊花综合网| 日韩成人高清无码| 国产福利在线| 国产女人水真多18毛片18精品| 中国熟女HD| 性久久久久久久| 日韩欧美亚洲| 狼友在线播放| 青娱乐亚洲精品| 91精品综合| 亚洲黄色无码视频| 天堂在线中文网| 色色爱爱| 免费AV在线| 青娱乐国产精品一区二区| 久久精品久久久久久久| 高清无码电影| 久草视频99| 国产成人一区二区无码| 老婆中文字幕乱码中文乱码 | 日本午夜三级视频| 亚洲AV人人夜夜澡人人| 超碰一级片| 精品日韩| a免费视频在线观看| 精品无码一区二区三区免费| 青青草精品| 亚洲欧美精品AAAAAA片| 51妺嘿嘿在线电影免费观看| 另类老妇videos另类| 亚洲丝袜不卡| 日韩v片| 欧美成人激情视频| 老熟女17页一91| 丁香五月成人网| 欧美性性生交XXXXX无码| 91精品国产综合久久久蜜臀酒店| 欧洲精品在线视频| 大香蕉网在线| 蜜桃av秘无码一区二区三区| 国产精品一级无码免费播放| 9久9久9久9久女女女女| 亚洲精品资源| 日韩无码人妻系列| 国产成人精品av在线观看| 免费A片国产毛无码A片| 91丨豆花丨国产极品| 搡老熟女-91Porn| 国产精品一区二区三| 一二三区| 日本黄色毛片| 人妻视频在线| 大香蕉伊人手机在线| 先锋资源在线视频| 99久久久| www.一级片| 中文字幕一区在线| 国产精品大香蕉| 日韩精品中文字幕在线观看| 51av在线| 996视频| 欧美成人视频网| 免费在线黄色电影| 性欧美丰满熟妇XXXX性久久久| 九九综合伊人7777777| 天天做天天爱| 18禁在线看| 暖暖在线视频| 婷婷五月天青草| 欧美一级一区| 精精品人妻一区二区三区| 久热这里| 午夜福利影片| 毛片A级成人片| 91视频高清无码| 亚洲无aV在线中文字幕| 操综合| 亚洲A片V一区二区三区| 无码不卡视频| 精品精品精品| 亚洲视频天堂| 亚洲性爱大全| 在线毛片网站| 老司机狠狠干| wwwAV在线观看| 欧美精品性爱| 国产天堂在线观看| 国产黄色在线播放| 怕怕怕视频| 白嫩在线| 国产激情欧洲在线观看一区二区三区 | 99这里只有精品| 欧美级黑寡妇毛片app| 欧美日韩在线免费| 中文字幕免费一区| 2025中文在线观看最好看的电影| 亚洲三级在线| 欧美性爱在线| 波多野结衣成人网站| 国产精品无码激情视频| 无码av在线观看| 亚洲无码aa| 亚洲高清无码中字| 中文在线资源| 狼人久久| 日本免费福利视频| 久久精品偷拍视频| 成人在线h| 国产精品黄色| 午夜老司机福利一二三区| 婷婷在线观看视频| 看一级黄色毛片| 中文人妻无码| 日韩精品一区二区三区四区 | 日本免费A片| a在线| 亚洲欧美成人网站| 91av电影| 国产亚洲婷婷| 欧美成人性爱图片| 黄色成人18| 国产AV无码影院| 蜜臀久久久| 免费a级毛片| 人妻少妇精品视频一区二区三区 | 无码一区二区高清| 俺去听听婷婷| 十八禁网站在线| www俺来也com| 亚洲网站在线| 大香蕉AV电影| 成人精品水蜜桃| 日批视频| www免费视频| 激情丁香五月天| 国产乱婬片视频| 欧美熟妇BBB搡BBB| 日韩黄色AV| 国产无遮挡又黄又爽又| 午夜九九九| 另类AV| 免费视频在线观看一区| www.污| 少妇搡BBBB搡BBB搡打电话| 777中文字幕| 爽好紧别夹喷水网站| 骚BBBB槡BBB槡BBB| 欧美日韩视频在线播放| 脓肿是什么原因引起的,该怎么治疗| 免费一级网站| 国产精品国产精品国产专区不片 | 美女一级变态毛片| 晚上碰视频| 国产成人精品免费视频| 欧美亚洲日韩一区| 国产AV黄色| av免费观看网站| 欧美久久精品| 亚洲有码人妻| 国产99久久九九精品无码免费| 91国产做爱| Av毛片| 无码内射视频| 久久人妻精品| 日韩三级片网站| 无码人妻蜜桃| 大香蕉中文在线| 亚洲欧洲日本在线| 无码人妻丰满熟妇| 天天操人人射| 国产久久久久久久| 亚洲高清毛片一区二区| 国产XXXXX| 日韩无码a| 91.xxxxx| 51妺妺嘿嘿午夜成人| 午夜福利欧美| 日韩在线中文字幕| 日本免费在线| 日日干AV| 欧美干| 亚洲AV永久无码成人| 国产无码一区二区| 成人先锋| 免费人成年激情视频在线观看| 亚洲av无码乱码| 996视频| 久久婷婷六月综合| 爱爱天堂| 小黄片网站| 走光无码一区二区三区| 中文一级片| 国产欧美成人在线| 日韩无码高清视频| 色视频在线观看免费| se99av| 超碰97资源| 西西888WWW大胆视频| 亚洲成人av在线观看| 99久久大香蕉| 免费亚洲婷婷| 日韩精品免费在线观看| 无码AV高清| 俺也去啦WWW色官网| 国产精品国产三级国产专区52 | 一级黄色蜜芽视频| 精品成人一区二区三区| 西西午夜视频| 双飞人妻13p| 无码av免费| Al激情欧美| 日韩色道| 在线日韩国产| 欧美一区二区在线| 国产成人AV在线观看| 牛牛影视一区二区| 国产精品色色| 黄色无码在线观看| 午夜成人三级| 亚洲免费小视频| 日韩激情一区二区| www.四虎成人网站| 国产亚洲欧美精品综合在线| 一级成人视频| 一级免费黄色片| 在线aaa| 国产一精品| 亚洲无码A片在线观看| 黄色在线视频观看| 亚洲欧美精品AAAAAA片| 伊人五月天激情| 午夜第一页| 成人黄色网址| 黄色视频网站免费在线观看| 日韩中文字幕精品| 国产婷婷精品| 884aa四虎影成人精品一区| 一本色道无码道| 大鸡巴操小逼视频| 色色天堂| 91丝袜| 91插插插插| 久草蜜臀| 国精产品一区一区三区| 黄色永久网站| jizz在线观看免费视频| 免费黄色电影在线观看| 神马午夜| 手机在线毛片| 妖精视频黄色| 婷婷五月中文字幕| 老女人日逼视频| 北条麻妃AV观看| 操逼基地| 日本免费在线| 成人无码交配视频国产网站| 國產精品777777777| 色色视频免费看| www深夜成人a√在线| 自拍三级片| 国产熟睡乱子伦午夜视频_第1集| 久久人人网| 免费a在线| 91成人电影在线| 99热这里只有精品7| 黄色成年人视频在线观看| 婷婷五月天激情网| h网站在线| 日本电影一区二区三区| 福利视频中文字幕| 99热在线观看| 人妻熟女字幕一区二区| 日韩AV一级片| 亚洲社区在线观看| 国产一级做a爱免费视频| 五月丁香欧美性爱| 免费国产黄色| 婷婷五月天成人电影| 亚洲欧美影院| 一本之道高清数码大全| 国产一区免费视频| 羞羞色院91蜜桃| 色婷婷一区| 欧美在线一级| 福利视频一区二区三区| 少妇BBB| 午夜操B| 亚洲s在线| 色色婷婷五月天| 狠狠撸在线视频| 人妻成人网| 2026国产精品视频| 97综合视频| 996热re视频精品视频这里| caobi999| 搡BBB搡BBBB搡BBBB| 91视频一区二区| 欧美日韩综合| 黄色特级毛片| 9l视频自拍蝌蚪9l成人| 亚洲中文第一页| 精品中文字幕视频| 黄片www.| 日本女人高潮视频| 骚小姨子无码| 91欧美日韩| 97国产在线视频| 极品人妻疯狂3p超刺激| 九九热精| 91社成人影院| 黄色视频网站在线看| 欧美A级成人婬片免费看| 成年网站| www.黄色av| 影音先锋亚洲无码| 思思热这里只有精品| 午夜精品久久久久久不卡8050| 午夜精品一区二区三区在线视频| 精品国产91乱码一区二区三区| www.污| 大鸡巴视频在线观看| 日韩欧美分区视频| 中文字幕永久在线观看| 国产精品免费一区二区三区都可以| 色色综合视频| 91人人操人人| 大地影视中文第三页最新在线观看| 国产熟女av| 國產精品777777777| 久操久干| 高清无码不卡视频| 一边做一边说国语对白| 国产AV直播| 日韩人妻久久| 亚洲精品二| 婷婷五月天丁香在线| 欧美三级网址| 日韩美女久久| 桃花岛tⅴ+亚洲品质| 青青青亚州视频在线| 日韩在线观看网址| 国产精品丝袜| 男女av免费| 大香蕉免费在线| 日韩在线观看一区二区| 久久精品一区二区三区不卡牛牛 | 成人性爱视频在线观看| 97久久精品国产熟妇高清网| 国产AV毛片| 天天干天天日天天干| 久热精品视频| 国产操B| 欧美性国产| 亚洲精品国产精品乱玛不99| 中国乱伦视频| 欧美一级黄片免费看| 亚洲天堂美女| 亚洲午夜久久| 黄片网站在线免费观看| 久色婷婷| 日本色电影在线观看| 人人亚洲| 国产精品国产精品国产专区不| 日韩欧美内射| 国产精品A片守望| 成人AV天堂| 婷婷五月天色| 午夜五月天| 国产一级A片视频| www.黄色大片| 人人操人人操人人操人人操| 国产黄色视频免费看| 免费视频无码| 18禁网站禁片免费观看| 日韩欧美成人在线| 尤物av| 成人AV电影在线观看| 人妻丰满熟妇| 伊人精品| 在线免费看黄网站| 最新色站| 亚洲三级片在线视频| 久久久久成人电影| 羽月希在线播放| 99热在线中文字幕| 国产婬片lA片www777| 中文字字幕在线| 国产伊人影院| 97激情| 国内特级毛片| 中日美朝美女一级片免费看 | 成人免费视频在线观看| 99re视频精品| 99热这里只有精品999| 三级黄片网站| 人人草人人澡| 免费A片国产毛无码A片| 日韩黄片| 国产特黄级AAAAA片免| 天天色粽合合合合合合合| 欧美午夜黄片| 操逼五月天| 苍井空亚洲精品AA片在线播放 | 91爱搞搞| 俺也色俺也干| 俺也来最新色视频| 国产真实露脸乱子伦对白高清视频| 五月激情网站| 青操av| 国产精品一区二区三区不卡| 午夜啪啪视频| 久久天天操| 精品人妻一区二区三区在| 嫩BBB槡BBBB槡BBB小号| 蜜桃人妻无码| 女人18片毛片60分钟黃菲菲| 无码av在线观看| 国产免费一区二区三区四区| 尻屄视频免费| 视频一区18| 边摸边做| 精品国产一二三| 亚洲欧洲无码视频| 国产欧美一区二区三区视频在线观看| 你懂的视频在线| 亚洲高清无码播放| 丰满人妻一区二区三区四区不卡| 色先锋av| 特级西西444www大胆免费看| 亚洲精品国产精品乱码不卡√香蕉| 午夜乱轮| 无码精品视频在线观看| 男女爱爱动态图| 91人妻人人人| 久久艹网| 午夜国产在线| 五月丁香婷婷开心| 国产成人精品av在线观看| 久久午夜无码鲁丝片午夜精| 午夜精品久久久久久不卡8050 | 91视频www| 成人在线视频观看| 天堂中文8资源在线8| 国产男女AV| 国产精品无码一区二区三区免费 | 午夜激情乱伦| 日韩精品无码一区二区| 加勒比综合无码| 麻豆国产91在线播放| 手机看片福利| 91在线视频免费播放| 国产美女av| 日韩在线观看网站| 动漫一区二区| 西西特级无码444www| 一级黄色影片| 97人妻精品一区二区三区图片| 91麻豆精品国产91久久久熟女| 怕怕怕视频| 无码中文字幕在线视频| 免费黄片在线看| 夜夜嗨av一区二区三区| 国产精品视频网站| 亚洲国产三级| 免费看无码| 伊人久久艹| 久久嫩草精品| 超碰人人爱国产视| 日韩性视频| 日韩欧美亚洲一区二区三区| 91成人视频在线播放| 国产尤物在线| 久久久久久久大香蕉| 婷婷色网| 亚洲白浆| 日韩激情网| 在线免费观看黄色网址| 1024国产| 成人A片在线播放| 国产97在线观看| 球AV在线| 开心激情网五月天| 香蕉成人网| 国产无码影视| 国产无码高潮在线| 久久久久久亚洲AV黄床| 超碰三级| 亚洲中文字幕日本| 免费欧美性爱视频| AV青草| 一级A级毛片| 成人国产精品在线观看| 国产多人搡BBBB槡BBBB| 日韩性爱视频| 日韩精品视频一区二区三区| 黄色免费网站| 国产农村妇女精品一二区| 一区二区三区久久久| 91亚洲精品视频在线| 九九成人| 操女人大逼| 午夜激情网站| 狼友在线播放| 国内自拍第一页| 黄色视频免费观看国产| 国产精品秘麻豆果冻传媒潘甜甜丶 | 翔田千里在线观看| 无码一道本| 日本午夜无码| 日韩av在线免费观看| 亚洲欧美天堂| 日韩操逼视频| 97人妻精品一区二区三区图片| av不卡免费观看| 久久99久久99久久99| 尤物av在线| 色色免费视频| 骚逼日本| av在线免费播放| 亚洲日韩在线中文字幕| 国产天天操| 日韩大香蕉视频| 五月婷婷性爱| 日韩精品五区| 免费视频久久久| 亚洲日本在线观看| 麻豆视频一区二区三区| 999reav| 在线亚洲免费| 一本色道久久综合亚洲怎么玩| 国产精品九九| 在线色网站| 午夜福利影院在线| 久久99精品久久久水蜜桃| 操碰在线观看| 日比视频| 成人伊人综合| 九色蝌蚪9l视频蝌蚪9l视频成人熟妇| 91色色色| wwwsesese| 人妻懂色av粉嫩av浪潮av| 日韩城人免费| 大香蕉伊人精品| 91丨露脸丨熟女精品| 国模吧一区| 超碰77| 日本在线不卡一区| 亚洲免费视频在线| 欧美亚洲日韩一区二区| 亚洲AV综合色区无码国产播放| 久久草在线| 自拍亚洲欧美| 亚洲午夜AV| 嫩BBB嫩BBB嫩BBBn嫩| 18禁无码永久免费网站大全| 久碰人妻人妻人妻| 玖玖在线| 亚洲V国产v欧美v久久久久久| 日韩無码专区| 懂色成人av影院| 狠狠婷婷| 人妻精品无码| 成人无码欧美大片免费看| 成人黄色A片| 老妇槡BBBB槡BBBB槡| 69福利社| 国产欧美在线不卡| 精品不卡| 久久免费在线视频| 婷婷五月综合激情| 丰臀肥逼高清视频电影播放| 一级色情片| 12——13女人毛片毛片| 2020人妻中文字幕| 国产亲子乱A片免费视频| jizz在线观看| 天天操天天日天天射| 国产黄色视频观看| 五月婷婷影院| 午夜性爱网站| 狠狠躁日日躁夜夜躁A片男男视频| 操美女嫩逼| 黄色福利| 欧美AAA视频| 婷婷激情av| 一边做一边说国语对白| 大香焦草久| 水蜜桃视频在线观看| 蝌蚪窝视频在线| www.18av| av亚洲波多野结衣白嫩水多波| 91少妇精品| 无码人妻一区二区| 69视频国产| 黄色视频电影| 能看的操逼视频| 欧美成人不卡| 日韩一区二区在线观看| 日韩黄色av| 亚洲无码成人网| 91麻豆精品国产91久久久久久| 超碰碰人人| 成人一二区| 久久国产乱子伦精品免费女,网站| 国产福利在线观看| 亚洲无码一二区| 日韩色情在线| 老熟女搡BBBB搡BBBB视频| 日本高清视频www| www.91av| 人人插人人操| 日韩肏屄视频| 农村老太HD肉HD| 9久9久9久9久女女女女| 蜜桃AV在线观看| 亚洲精品天堂无码| 亚洲国产熟妇综合色专区| 夜夜欢天天干| 91婷婷五月天| 午夜成人网站| 亚洲美女在线观看| 黄色内射视频| 中文字幕+乱码+中文乱码视频在线观看| 国产欧美在线免费观看| 日本一级片在线播放| 国产精品一区二区三区四区| 无码h| 啪啪网站免费| 成人AA片| 久久成人小电影| 欧洲亚洲免费视频| 男人天堂婷婷| 国产成人精品免费看视频| 中文字幕无码播放| 草逼网视频| 亚洲超级高清无码第一在线视频观看| 日韩黄色免费视频| 日本高清一区二区高清免费视频 | 国产艹逼视频| 俺去啦在线视频| 精品国产污污免费网站入口| 激情成人五月天| 欧美性高潮| 啪一啪操一操| 亚洲欧美不卡| 五月停亭六月,六月停亭的英语 | 大香焦伊人国产| 亚洲精品国产精品乱码不卡√香蕉| 久草在在线视频| 中文AV第一页| 高清无码1区| 狠狠干高清成人二区三区| 大香蕉综合| 日韩一级黄片| 伊人成人在线| 国产精品999| 一插菊花综合网| 91在线免费视频| 一区二区三区四区视频| 91av在线播放| 91视频在线观看18| 在线无码| 人妻japanesewoman| 爱爱帝国综合社区| 无码一区二区北条| 日本人妻中出| 青青娱乐亚洲无| 日本一区二区网站| 成人午夜A片免费看| www黄片视频| 免费黄色小视频在线观看| 日韩中文字幕区| av在线小说| 午夜福利在线播放| 超碰在线人妻| 七十路の高齢熟女千代子下载| 国产成人精品av在线观看| 99热精品国产|