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

SpringBoot 參數(shù)校驗(yàn),高級(jí)特性,非常實(shí)用!

共 8531字,需瀏覽 18分鐘

 ·

2022-05-15 23:16

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

簡(jiǎn)單使用

Java API規(guī)范 (JSR303) 定義了Bean校驗(yàn)的標(biāo)準(zhǔn)validation-api,但沒(méi)有提供實(shí)現(xiàn)。hibernate validation是對(duì)這個(gè)規(guī)范的實(shí)現(xiàn),并增加了校驗(yàn)注解如@Email、@Length等。Spring Validation是對(duì)hibernate validation的二次封裝,用于支持spring mvc參數(shù)自動(dòng)校驗(yàn)。接下來(lái),我們以spring-boot項(xiàng)目為例,介紹Spring Validation的使用。

引入依賴(lài)

如果spring-boot版本小于2.3.x,spring-boot-starter-web會(huì)自動(dòng)傳入hibernate-validator依賴(lài)。如果spring-boot版本大于2.3.x,則需要手動(dòng)引入依賴(lài):
<dependency>??
????<groupId>org.hibernategroupId>??
????<artifactId>hibernate-validatorartifactId>??
????<version>6.0.1.Finalversion>??
dependency>??
對(duì)于web服務(wù)來(lái)說(shuō),為防止非法參數(shù)對(duì)業(yè)務(wù)造成影響,在Controller層一定要做參數(shù)校驗(yàn)的!大部分情況下,請(qǐng)求參數(shù)分為如下兩種形式:
  1. POST、PUT請(qǐng)求,使用requestBody傳遞參數(shù);

  2. GET請(qǐng)求,使用requestParam/PathVariable傳遞參數(shù)。

下面我們簡(jiǎn)單介紹下requestBodyrequestParam/PathVariable的參數(shù)校驗(yàn)實(shí)戰(zhàn)!

requestBody參數(shù)校驗(yàn)

POSTPUT請(qǐng)求一般會(huì)使用requestBody傳遞參數(shù),這種情況下,后端使用** DTO 對(duì)象進(jìn)行接收。只要給 DTO 對(duì)象加上@Validated注解就能實(shí)現(xiàn)自動(dòng)參數(shù)校驗(yàn)**。比如,有一個(gè)保存User的接口,要求userName長(zhǎng)度是2-10,accountpassword字段長(zhǎng)度是6-20。如果校驗(yàn)失敗,會(huì)拋出MethodArgumentNotValidException異常,Spring默認(rèn)會(huì)將其轉(zhuǎn)為400(Bad Request)請(qǐng)求。
DTO 表示數(shù)據(jù)傳輸對(duì)象(Data Transfer Object),用于服務(wù)器和客戶(hù)端之間交互傳輸使用的。在 spring-web 項(xiàng)目中可以表示用于接收請(qǐng)求參數(shù)的Bean對(duì)象。
  • 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ù)上聲明校驗(yàn)注解
@PostMapping("/save")??
public?Result?saveUser(@RequestBody?@Validated?UserDTO?userDTO)?{??
??
????return?Result.ok();??
}??
這種情況下,使用@Valid@Validated都可以

requestParam/PathVariable參數(shù)校驗(yàn)

GET請(qǐng)求一般會(huì)使用requestParam/PathVariable傳參。如果參數(shù)比較多 (比如超過(guò) 6 個(gè)),還是推薦使用DTO對(duì)象接收。否則,推薦將一個(gè)個(gè)參數(shù)平鋪到方法入?yún)⒅?。在這種情況下,**必須在Controller類(lèi)上標(biāo)注@Validated注解,并在入?yún)⑸下暶骷s束注解 (如@Min等)**。如果校驗(yàn)失敗,會(huì)拋出ConstraintViolationException異常。代碼示例如下:
@RequestMapping("/api/user")??
@RestController??
@Validated??
public?class?UserController?{??
??
????@GetMapping("{userId}")??
????public?Result?detail(@PathVariable("userId")?@Min(10000000000000000L)?Long?userId)?{??
??
????????UserDTO?userDTO?=?new?UserDTO();??
????????userDTO.setUserId(userId);??
????????userDTO.setAccount("11111111111111111");??
????????userDTO.setUserName("xixi");??
????????userDTO.setAccount("11111111111111111");??
????????return?Result.ok(userDTO);??
????}??
??
????@GetMapping("getByAccount")??
????public?Result?getByAccount(@Length(min?=?6,?max?=?20)?@NotNull?String??account)?{??
??
????????UserDTO?userDTO?=?new?UserDTO();??
????????userDTO.setUserId(10000000000000003L);??
????????userDTO.setAccount(account);??
????????userDTO.setUserName("xixi");??
????????userDTO.setAccount("11111111111111111");??
????????return?Result.ok(userDTO);??
????}??
}??

統(tǒng)一異常處理

前面說(shuō)過(guò),如果校驗(yàn)失敗,會(huì)拋出MethodArgumentNotValidException或者ConstraintViolationException異常。在實(shí)際項(xiàng)目開(kāi)發(fā)中,通常會(huì)用統(tǒng)一異常處理來(lái)返回一個(gè)更友好的提示。比如我們系統(tǒng)要求無(wú)論發(fā)送什么異常,http的狀態(tài)碼必須返回200,由業(yè)務(wù)碼去區(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("校驗(yàn)失敗:");??
????????for?(FieldError?fieldError?:?bindingResult.getFieldErrors())?{??
????????????sb.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append(",?");??
????????}??
????????String?msg?=?sb.toString();??
???????return?Result.fail(BusinessCode.參數(shù)校驗(yàn)失敗,?msg);??
????}??
??
????@ExceptionHandler({ConstraintViolationException.class})??
????@ResponseStatus(HttpStatus.OK)??
????@ResponseBody??
????public?Result?handleConstraintViolationException(ConstraintViolationException?ex)?
{??
????????return?Result.fail(BusinessCode.參數(shù)校驗(yàn)失敗,?ex.getMessage());??
????}??
}??

進(jìn)階使用

分組校驗(yàn)

在實(shí)際項(xiàng)目中,可能多個(gè)方法需要使用同一個(gè)DTO類(lèi)來(lái)接收參數(shù),而不同方法的校驗(yàn)規(guī)則很可能是不一樣的。這個(gè)時(shí)候,簡(jiǎn)單地在DTO類(lèi)的字段上加約束注解無(wú)法解決這個(gè)問(wèn)題。因此,spring-validation支持了分組校驗(yàn)的功能,專(zhuān)門(mén)用來(lái)解決這類(lèi)問(wèn)題。還是上面的例子,比如保存User的時(shí)候,UserId是可空的,但是更新User的時(shí)候,UserId的值必須>=10000000000000000L;其它字段的校驗(yàn)規(guī)則在兩種情況下一樣。這個(gè)時(shí)候使用分組校驗(yàn)的代碼示例如下:
  • 約束注解上聲明適用的分組信息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注解上指定校驗(yàn)分組
@PostMapping("/save")??
public?Result?saveUser(@RequestBody?@Validated(UserDTO.Save.class)?UserDTO?userDTO)?{??
??
????return?Result.ok();??
}??
??
@PostMapping("/update")??
public?Result?updateUser(@RequestBody?@Validated(UserDTO.Update.class)?UserDTO?userDTO)?{??
??
????return?Result.ok();??
}??

嵌套校驗(yàn)

前面的示例中,DTO類(lèi)里面的字段都是基本數(shù)據(jù)類(lèi)型String類(lèi)型。但是實(shí)際場(chǎng)景中,有可能某個(gè)字段也是一個(gè)對(duì)象,這種情況先,可以使用嵌套校驗(yàn)。
比如,上面保存User信息的時(shí)候同時(shí)還帶有Job信息。需要注意的是,此時(shí)DTO類(lèi)的對(duì)應(yīng)字段必須標(biāo)記@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?{??
????}??
}??
嵌套校驗(yàn)可以結(jié)合分組校驗(yàn)一起使用。還有就是嵌套集合校驗(yàn)會(huì)對(duì)集合里面的每一項(xiàng)都進(jìn)行校驗(yàn),例如List字段會(huì)對(duì)這個(gè)list里面的每一個(gè)Job對(duì)象都進(jìn)行校驗(yàn)。

集合校驗(yàn)

如果請(qǐng)求體直接傳遞了json數(shù)組給后臺(tái),并希望對(duì)數(shù)組中的每一項(xiàng)都進(jìn)行參數(shù)校驗(yàn)。此時(shí),如果我們直接使用java.util.Collection下的list或者set來(lái)接收數(shù)據(jù),參數(shù)校驗(yàn)并不會(huì)生效!我們可以使用自定義list集合來(lái)接收參數(shù):
  • 包裝List類(lèi)型,并聲明@Valid注解
public?class?ValidationList<E>?implements?List<E>?{??
??
????@Delegate??
????@Valid??
????public?List?list?=?new?ArrayList<>();??
??
????@Override??
????public?String?toString()?{??
????????return?list.toString();??
????}??
}??
@Delegate注解受lombok版本限制,1.18.6以上版本可支持。如果校驗(yàn)不通過(guò),會(huì)拋出NotReadablePropertyException,同樣可以使用統(tǒng)一異常進(jìn)行處理。
比如,我們需要一次性保存多個(gè)User對(duì)象,Controller層的方法可以這么寫(xiě):
@PostMapping("/saveList")??
public?Result?saveList(@RequestBody?@Validated(UserDTO.Save.class)?ValidationList?userList)?{??
??
????return?Result.ok();??
}??

自定義校驗(yàn)

業(yè)務(wù)需求總是比框架提供的這些簡(jiǎn)單校驗(yàn)要復(fù)雜的多,我們可以自定義校驗(yàn)來(lái)滿(mǎn)足我們的需求。自定義spring validation非常簡(jiǎn)單,假設(shè)我們自定義加密id(由數(shù)字或者a-f的字母組成,32-256長(zhǎng)度)校驗(yàn),主要分為兩步:
  • 自定義約束注解
@Target({METHOD,?FIELD,?ANNOTATION_TYPE,?CONSTRUCTOR,?PARAMETER})??
@Retention(RUNTIME)??
@Documented??
@Constraint(validatedBy?=?{EncryptIdValidator.class})??
public?@interface?EncryptId?
{??
??
????String?message()?default?"加密id格式錯(cuò)誤";??
??
????Class[]?groups()?default?{};??
??
????Class[]?payload()?default?{};??
}??
  • 實(shí)現(xiàn)ConstraintValidator接口編寫(xiě)約束校驗(yàn)器

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)?{??
??
????????if?(value?!=?null)?{??
????????????Matcher?matcher?=?PATTERN.matcher(value);??
????????????return?matcher.find();??
????????}??
????????return?true;??
????}??
}??

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

編程式校驗(yàn)

上面的示例都是基于注解來(lái)實(shí)現(xiàn)自動(dòng)校驗(yàn)的,在某些情況下,我們可能希望以編程方式調(diào)用驗(yàn)證。這個(gè)時(shí)候可以注入javax.validation.Validator對(duì)象,然后再調(diào)用其api。
@Autowired??
private?javax.validation.Validator?globalValidator;??
??
@PostMapping("/saveWithCodingValidate")??
public?Result?saveWithCodingValidate(@RequestBody?UserDTO?userDTO)?{??
????Set>?validate?=?globalValidator.validate(userDTO,?UserDTO.Save.class);??
??
????if?(validate.isEmpty())?{??
??
????}?else?{??
????????for?(ConstraintViolation?userDTOConstraintViolation?:?validate)?{??
??
????????????System.out.println(userDTOConstraintViolation);??
????????}??
????}??
????return?Result.ok();??
}??

快速失敗 (Fail Fast)

Spring Validation默認(rèn)會(huì)校驗(yàn)完所有字段,然后才拋出異常??梢酝ㄟ^(guò)一些簡(jiǎn)單的配置,開(kāi)啟Fali Fast模式,一旦校驗(yàn)失敗就立即返回。
@Bean??
public?Validator?validator()?{??
????ValidatorFactory?validatorFactory?=?Validation.byProvider(HibernateValidator.class)??
????????????.configure()??
??
????????????.failFast(true)??
????????????.buildValidatorFactory()
;??
????return?validatorFactory.getValidator();??
}??

@Valid@Validated區(qū)別

實(shí)現(xiàn)原理

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

spring-mvc中,RequestResponseBodyMethodProcessor是用于解析@RequestBody標(biāo)注的參數(shù)以及處理@ResponseBody標(biāo)注方法的返回值的。顯然,執(zhí)行參數(shù)校驗(yàn)的邏輯肯定就在解析參數(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();??
??
????????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)?{??
??
????????????????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()調(diào)用了validateIfApplicable()進(jìn)行參數(shù)校驗(yàn)。
protected?void?validateIfApplicable(WebDataBinder?binder,?MethodParameter?parameter)?{??
??
????Annotation[]?annotations?=?parameter.getParameterAnnotations();??
????for?(Annotation?ann?:?annotations)?{??
??
????????Validated?validatedAnn?=?AnnotationUtils.getAnnotation(ann,?Validated.class);??
??
????????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});??
??
????????????binder.validate(validationHints);??
????????????break;??
????????}??
????}??
}??
看到這里,大家應(yīng)該能明白為什么這種場(chǎng)景下@Validated@Valid兩個(gè)注解可以混用。我們接下來(lái)繼續(xù)看WebDataBinder.validate()實(shí)現(xiàn)。
@Override??
public?void?validate(Object?target,?Errors?errors,?Object...?validationHints)?{??
????if?(this.targetValidator?!=?null)?{??
????????processConstraintViolations(??
??
????????????this.targetValidator.validate(target,?asValidationGroups(validationHints)),?errors);??
????}??
}??
最終發(fā)現(xiàn)底層最終還是調(diào)用了Hibernate Validator進(jìn)行真正的校驗(yàn)處理。

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

上面提到的將參數(shù)一個(gè)個(gè)平鋪到方法參數(shù)中,然后在每個(gè)參數(shù)前面聲明約束注解的校驗(yàn)方式,就是方法級(jí)別的參數(shù)校驗(yàn)。實(shí)際上,這種方式可用于任何Spring Bean的方法上,比如Controller/Service等。其底層實(shí)現(xiàn)原理就是AOP,具體來(lái)說(shuō)是通過(guò)MethodValidationPostProcessor動(dòng)態(tài)注冊(cè)AOP切面,然后使用MethodValidationInterceptor對(duì)切點(diǎn)方法織入增強(qiáng)。
public?class?MethodValidationPostProcessor?extends?AbstractBeanFactoryAwareAdvisingPostProcessorimplements?InitializingBean?{??
????@Override??
????public?void?afterPropertiesSet()?{??
??
????????Pointcut?pointcut?=?new?AnnotationMatchingPointcut(this.validatedAnnotationType,?true);??
??
????????this.advisor?=?new?DefaultPointcutAdvisor(pointcut,?createMethodValidationAdvice(this.validator));??
????}??
??
????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?{??
??
????????????result?=?execVal.validateParameters(??
????????????????invocation.getThis(),?methodToValidate,?invocation.getArguments(),?groups);??
????????}??
????????catch?(IllegalArgumentException?ex)?{??
????????????...??
????????}??
??
????????if?(!result.isEmpty())?{??
????????????throw?new?ConstraintViolationException(result);??
????????}??
??
????????Object?returnValue?=?invocation.proceed();??
??
????????result?=?execVal.validateReturnValue(invocation.getThis(),?methodToValidate,?returnValue,?groups);??
??
????????if?(!result.isEmpty())?{??
????????????throw?new?ConstraintViolationException(result);??
????????}??
????????return?returnValue;??
????}??
}??
實(shí)際上,不管是requestBody參數(shù)校驗(yàn)還是方法級(jí)別的校驗(yàn),最終都是調(diào)用Hibernate Validator執(zhí)行校驗(yàn),Spring Validation只是做了一層封裝。
來(lái)源:juejin.cn/post/6856541106626363399


THE?END
熱門(mén)推薦:

PS:如果覺(jué)得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、轉(zhuǎn)發(fā)、在看。
瀏覽 34
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲精品区| 久久私拍视频| 日韩欧美一区二区三区不卡| 国产一级婬片A片| 国产黄色小电影| 日本成人高清视频| 国产卡一卡二在线| 一区二区三区国产精品| AAA片网站| 99热大香蕉| 免费草逼视频| 色婷婷免费视频| 欧美操逼网址| 亚洲人妻影院| 日韩欧美一区二区在线观看| 日本中文字幕视频| 免费视频在线观看黄| 最美孕交vivoestv另类| 2018天天操| 天天操天| 国产图区| 97热热| 成人无码区免费A片在线软件| 亚洲少妇熟女| 午夜天堂在线| 1204手机看片| 亚洲成人电影AV| 日韩黄色电影在线免费观看| 美女网站黄| 成人无码专区| 亚洲毛片在线观看| 亚洲精品中文字幕无码| 亚洲精品人伦一区二区| 欧美成人黄色A片| 中文字幕aV在线| 9l视频自拍九色9l视频成人| 四虎人妻| 狠狠91| 大鸡巴日小逼| 久久国产精品影院| 国产精品久久久无码专区| 国产一级片| 爱福利视频网| 亚洲激情在线| 亚洲成人黄色| 1024在线视频| 伊人无码视频| 久久99热这里只频精品6学生| 国产高清无码一区二区三区| 四虎精品成人无码A片| 国产v在线| 亚洲黄色视频网站在线观看| 97AV人妻无码视频二区| 人人天天爽| 亚洲男同tv| 18禁网站在线播放| A级片免费看| 久久视频网站| 香蕉成人网站在线观看| 婚闹不堪入目A片| 日日干天天日| 乱子伦一区二区三区视频在线观看 | 91精品国产aⅴ一区二区| 天天爱天天爽| 欧美搡BBBB搡BBB| anwuye官方网站| 秘亚洲国产精品成人网站| 国产做爰XXXⅩ久久久骚妇| 探花一区二区| 国产一级婬乱A片| 91大神网址| 欧美v在线观看| 亚洲成av| 精品久久免费一区二区三区| 婷婷成人综合网| 亚洲成人精品一区| 91av在线电影| 大香蕉熟女| 人人妻人人上| A免费在线观看| 欧美偷拍一区| 91热爆TS人妖系列| 日韩在线观看中文字幕| 久久成人无码电影| 搡老熟女-91Porn| 美女乱伦视频| 可以免费看的AV| 黄色片大全| 夜夜爽妓女77777毛片A片 | 女人久久久| 91在线播放视频| 国产性生活| 久久综合中文字幕| 国产乱子伦日B视频| 大香蕉久| 日韩综合| 大奶一区二区| 国产精品视频瘾无码| 在线国产黄色| 婷婷五月免费视频| 99精品国产一区二区| 国产无码电影网| 免费看黄色的网站| 欧美黄色免费在线观看| 日批动态图| 熟妇槡BBBB槡BBBB图| 亚洲熟女av中文字幕| 波多野结衣亚洲视频| 嫰BBB槡BBBB槡BBBB| 嫩BBB揍BBB揍BBB| 91丨国产丨熟女熟女| 人人干人人操人人摸| 操屄影院| 国产成人AV在线| 99久久久| 日韩gay| 亚洲欧美熟妇久久久久久久久| 黄色片免费视频网站| 思思热精品在线| 午夜免费福利视频| 日日夜夜综合| 99久久久无码国产精品性波多 | 婷婷成人五月天| 亚洲中文字幕无码在线观看| 伊人大香焦网| AV无码一区二区三区| 欧美视频基地| 影音先锋成人片| 国产精品一区二| 91精品丝袜久久久久久久久久粉嫩 | 伊人成人大香蕉| 夜夜骑天天操| 无码秘人妻一区红中av漫画| 午夜3D动漫AV| 一级成人片在线观看| 做爱A片| 草逼123| 久久AV网站| AV无码免费一区二区三区不卡| 国产三级国产三级国产| 成人乱无码AV在线观看| 欧美精品99久久久| 强奸校花到高潮| 91av电影网| 一级色色| 日韩欧美视频在线播放| 丁香五月天社区| AV网站免费观看| 日本无码在线播放| 国产美女裸体网站| 看国产毛片| 啪啪视频m3u8| 日韩黄色小电影| 一级A色情大片| 成人国产精品在线看| 日韩精品不卡| 久久久一区二区| 另类老妇性bbwbbwbbw| 国产高潮视频在线观看| 北条麻妃91视频| 仓井空一区二区| 日逼视频免费| 国产56页| 亚洲AV成人片色在线观看麻豆| 麻豆精品在线播放| 久综合网| 精品无码视频在线观看| 欧美视频第一页| 在线免费无码| 91视频美女内射| 在线看毛片网站| 97人妻一区二区精品视频| 色婷婷视频网站| 人人插人人干| 91在线观看高清18| 国产一区视频在线| 加勒比一区二区三区| 欧美sesese| 国产欧美精品一区二区色综合| 日韩黄色网址| footjobvk| 精品久草| 亚洲在线第一页| 欧美日韩在线视频播放| 老女人的逼| 免费看毛片中文字幕| 国产3p露脸普通话对白| 亚洲色婷婷五月天| 亚洲精品人伦一区二区| 毛片操逼视频| 婷婷色综合| 日韩免费AV| 91九色精品女同系列| 欧美高清一级| 黄片在线免费播放| 91综合视频| 人妻丝袜中出北条麻妃| 欧美一区二区三区在线播放| 影音先锋国产av| 国产免费黄色片| 欧美一区二区三区在线| 男人天堂无码成人| 激情婷婷网| 国产在线观看无码免费视频| 中文字幕视频| 伊人9| 日中国老太太B| 婷婷五月AV| 激情六月天| 黄片91| 人人干人人操人人| 手机在线观看av| 日韩精品免费| 国产成人AA| 欧美特黄一级视频| 国产黄色视频免费| 午夜毛片| 无码人妻中文| 人人爽久久涩噜噜噜网站| 波多野结衣无码AV在线| 亚洲无码视频在线观看高清| 午夜在线无码| 亚洲国产熟妇无码日韩| 亚洲精品欧美| 成人午夜视频精品一区| 色婷婷久久综合| 视频三区| 国产一级片| 日本熟妇在线| 男女啊啊啊| 一本大道东京热av无码| 婷婷五月激情中文字幕| www.操操操| 水密桃网站| 成人小视频观看| 在线无码视频观看| 日逼中文字幕| 热久久免费视频| 91国产精品在线视频| 夜夜夜叫天天天做| 亚洲色逼| 日韩电影免费在线观看| 亚洲.无码.制服.日韩.中文字幕| 国产免费麻豆| 日产精品久久| 囯产一级a一级a免费视频| 北条麻妃网站| 性爱久久久| 亚洲AV人人夜夜澡人人| 一级AA毛片| 亚洲色无码人妻激情| 免费国产黄色视频网站| 欧美在线一级| 殴殴美日韩在线| 波多野结衣精品无码| 日韩中文字幕高清| 69天堂| 亚洲一区亚洲二区| 中文有码在线| 中文字幕久久播放| 四虎影成人精品A片| 国产成人亚洲综合A∨婷婷| 国产系列每日更新| 人妻无码人妻| 人人妻人人操人人| 欧美性爱一级视频| 熟妇熟女一区二区三区| 91狠狠综合久久久| r四虎18| 91无码人妻精品一区二区蜜桃| 久热精品视频在线观看| 亚洲日韩毛片| 日本中文字幕不卡| 成人视频网站在线观看| 久久久国产精品在线| 日韩在线观看一区| 在线中文字幕777| 色婷婷av在线| 久久综合中文字幕| 在线看毛片网站| aaa无码| 三洞齐开Av在线免费观看| 麻豆一区在线| 九九九久久久| 在线视频三区| 体内射精视频| 色婷婷网| 国产免费一级特黄A片| 国产激情网| 操大逼视频免费国产| a片视频网站| 国产一区二区精品| 天天色操| 中国字幕在线观看韩国电影| 北条麻妃精品青青久久价格| 欧美肥臀| 五月天网址| 九九九九九精品| 国产jk在线观看| 久久久精品999| 91AV成人| 底流量AV电影在线| 在线免费看黄视频| 影音先锋aV成人无码电影| 少妇性受XXXX黑人XYX性爽| 久操人妻| 国产欧美欧洲| 中文在线字幕免费观| 亚洲在线观看视频| 久草视频这里只有精品| 日韩成人无码一区二区| 日韩熟妇人妻中文字幕| 国产成人亚洲综合A∨婷婷| 激情乱伦网| 日韩一级二级三级| 丰臀肥逼高清视频电影播放| 国內精品久久久久久久| 五月网| jlzz18| 热热av| 五月一区| 国产成人无码永久免费| 亚洲一区色| 91老熟女视频| 激情乱伦网| 亚洲人妻系列| 国产黄色AV片| 围产精品久久久久久久| 亚洲韩国中文字幕| 精品AV无码| 男女日皮视频| 日韩免费三级| 国产在线激情| 美女网站黄色| 91人妻成人精品一区二区| 亚洲AV无码乱码国产精品黑人| 欧美日韩性爱视频| 蜜桃久久精品成人无码AV| 99激情视频| 97爱视频| 激情综合婷婷| 少妇BBBB| 欧美香蕉| 十八无码成人免费网站| 久久久久国产视频| 久久久久久久久黄色| 青青草青娱乐| 国产AV剧情| 97人妻人人澡| 中文无码高清视频| 91日韩欧美| 中文无码一区二区三区四区| 日韩欧美国产高清91| h视频在线观看网站| 国产伦精品一区二区三区妓女| 风间由美大荫蒂无码AV| 人人看人人爽| 免费无码毛片一区二区A片| 影音先锋成人AV| 国产精品永久久久久久久久久| 欧美操| 亚洲成人在线网| 婷婷在线视频| 色色网五月天| 色色色成人视频| 欧美性爱xxxx| 自拍偷拍一区二区三区| 操少妇视频| 大学生18一19GAY169| 草久在线视频| 91人人妻人人爽| 无码高清一区二区| 另类视频在线| 精品网站999www| 午夜AV在线免费观看| 蜜臀av在线| 伊人中文在线| 日韩精品极品视频在线观看免费 | 无码精品人妻| 婷婷操| 91人人妻人人澡人人爽人人精品| 成人AV免费在线观看| jizz国产视频| 操B在线观看| 91婷婷射| 日逼无码| 色黄网站在线观看| 牛牛av| anwuye官方网站| 亚洲AV无码第一区二区三区蜜桃| 中国一级黄色毛片| 蜜桃影视| 美女白嫩嫩大BBB欣赏| 青青草手机视频在线| 欧美一区不卡| 欧美天天性| 亚洲福利视频网| 天天色天天撸| 国产中文字幕视频| 人人妻天天干| 91探花足浴店按摩店| 日本欧美在线视频| 天天干强奸视频在线综合| 亚洲成人AⅤ| 天天撸天天色| 午夜AV影院| 日韩成人AV电影| 欧美三P囗交做爰| 成人福利视频在线观看| 国产成人超碰| 欧洲成人在线观看| 一级A片久久久免费直播间| 蜜臀久久久久久999| 国精品无码A区一区二区| 久草小视频| 黄片视频在线播放| 姐弟乱伦性爱| 亚洲精品色图| 国产午夜成人视频| 国产精品一二三区夜夜躁| 无码AV一区二区| 三区在线观看| 97福利视频| 潮喷在线观看| 欧美精品18videosex性欧美| 91视频内射| 成人天堂一区二区三区| 黄色视频在线观看网站| 欧美a片在线| 日韩五月婷婷| AA片免费网站| 国产人妻一区二区精选| 天堂亚洲AV无码精品成人| 在线毛片网站| 高清无码视频在线| 久久久国产精品黄毛片| 国产操逼小视频| 一区二区三区四区不卡| 亚洲综合国产| 日本一区二区在线视频| 91青青草| 思思热视频在线观看| 天天视频亚洲| 无码一道本| 国产第8页| 玖玖热在线视频| 亲子乱AⅤ一区二区三区| 97国产精品视频人人做人人爱 | 狠狠色噜噜狠狠狠7777米奇网| 欧美在线网站| 一级在线播放| 操逼第二页| 大香蕉在线网| 免费观看高清无码| 日韩一级电影在线| 无码AV一区二区| 国产免费观看视频| 一级片黄色电影| 婷婷五月在线观看| 色婷婷18正码国产| 久久久97精品久久| 7777av| 伊香蕉大综综综合| AA级黄色视频| 3D动漫精品啪啪一区二区下载| 欧美日韩一道本| 国产免费观看av| 人人操在线播放| 韩国三级片在线| 超碰在线进入| 国产91白丝在一线播放| 在线观看老湿视频福利| 69av视频在线观看| 一级爱爱免费视频| 综合久久亚洲| 丁香五月伊人| 中文字幕欧美日韩| 男女日逼网站| www.91在线看| 丁香婷婷色五月激情综合三级三级片欧美日韩国 | 人人超碰在线| 久久久久久麻豆| 中文字幕在线观看免费高清完整版在线观看| 91麻豆福利| 欧美综合视频在线观看| 高清无码在线观看视频| AV小说在线观看| 奇米狠狠777| 亚洲免费视频在线观看| 99免费观看视频| 欧美成人网站免费在线观看| 親子亂子倫XXXX| 日本黄色视频在线播放| 欧美三级推荐| 四川性BBB搡BBB爽爽爽小说| 99热大香蕉| 成人看片黄a免费看视频| 免费在线看A| 人人操夜夜| 男女草逼| 天堂中文资源库| 日韩欧美大片在线观看| 免费三区| 中文无码人妻| 久久久久久婷婷| 精品免费一区二区三区四区| 牛牛成人在线视频| 国产毛片在线看| 西西444WWW无码大胆知乎| 蜜乳av红桃嫩久久| 九九免费视频| 久久久777| 77久久| 人妻熟女在线视频| 久久青留社区金玉| 欧美A√| 天天操天天操天天操天天操| 丰满人妻一区二区三区46| 国产欧美一区二区三区视频| 99色热| www.日本色| 色色五月丁香| 国产精品日韩欧美| 国产免费A片| A级毛片在线观看| 成人免费网站在线| 成人免费无码激情AV片| 老熟女17页一91| 国产理论视频| 日本老熟妇| 色综合久久88色综合| 亚洲一级av无码毛片精品| 91久久爽久久爽爽久久片| 午夜电影无码| 迷情校园综合| 免费观看黄片视频| 色欧美亚洲| 日韩国产AV| 久久久久久久久免费看无码| 国产成人无码Av片在线公司| 影音先锋色资源站| 天天操嫩逼无套视频| 国产在线成人| 午夜99| 亚洲无码资源| 欧美一区二区三区系列电影| 两根茎一起进去好爽A片在线观看 日本三级AAA三级AAAA97 | 国产精品女人777777| 日韩无码高清免费视频| 久久女人| 少妇搡BBBB搡BBB搡造水爽| 亚洲撸撸| 国产69精品久久| 色婷婷五月激情| 三级无码| 亚洲无码在线播放| 日韩经典无码| 五月婷婷国产| 大香蕉做爱视频| 欧美精品操逼| aa人人操夜夜操人人| 色婷婷综合在线| 爆乳尤物一区二区三区| 亚洲欧美在线免费观看| 日韩性爱一区| 精品国产AV色一区二区深夜久久| 91蝌蚪久久| 无码一区二区三区免费| 搡BBBB| 91探花秘在线播放偷拍| 黄色成人在线观看视频| 天堂无码高清| 色婷婷官网| 东京热在线观看| 江苏妇搡BBBB搡BBBB| 欧美成人精品欧美一级私黄| 中文无码字幕在线| 免费日比视频| 国产一区在线观看视频| 美女在线扣穴| 日本三级片视频不卡| 色妹子综合| 亚洲精品视频在线播放| 做爱视频无码| 九九性爱网| 国产一级a毛一级a毛观看视频网站www.jn | 影音先锋成人资源网| 亚洲女人在线| 天天干天天射天天爽| 无码在线专区| 欧美性爱在线网站| 黄色片久久久| 欧美色成人免费在线视频| 成人无码www在线看免费| 97人人草| 欧美一级特黄A片免费| 日本国产在线| 99久热在线精品视频| 免费的黄片| 性爱av在线观看| AV第一页| 人妻无码HEYZO少妇精品 | 亚洲成人电影天堂| 亚洲中文字幕播放| 四虎2025在线51| 少妇做爱视频| 91av在线看| 不卡AV在线| 欧美婷婷五月天| 中文字幕成人视频| 99久久久国产| 人妻av无码| 亚洲毛片网站| 强伦人妻一区二区三区视频| 欧美老女人逼| 嫖中国站街老熟女HD| 欧美成人精品无| 乱轮少妇| 91婷婷| 99人妻视频| 亚洲国产高清无码| 亚洲日韩Av无码中文字幕美国 | 噼里啪啦免费观看视频大全| 国产乱婬AV片免费| 欧美性BBwBBwBBwHD| 国产黄色不卡| 国产av一区二区三区| 日韩黄色网| 天天天天天天干| 成人毛片在线观看| 51妺嘿嘿午夜福利| www.yw尤物| 爱爱黄色视频| 国产毛片毛片毛片| 夜夜操网站| 蜜桃网站在线观看| 无码V | AV无码免费观看| 特级毛片片A片AAAAAA| 一本大道DVD中文字幕| 污视频在线看| 熟妇人妻丰满久久久久久久无码| 俺也去五月婷婷| 亚洲精品成人无码AV在线| 亚洲高清无码网站| 国产白丝视频| 51妺嘿嘿在线电影免费观看 | 竹菊av一区二区三区四区五区| 日韩AV免费在线播放| 奶头和荫蒂添的好舒服囗交漫画| 一区二区三区欧美| 久草视频免费在线观看| 国产高清无码视频在线观看| 亚洲日韩国产AV无码无码精品| 大香焦久久| 91美女网站| 久久亚洲欧美| 日韩啪啪视频| 四虎黄色网址| 美女黄片| 黄色特级片| 久草视频免费| 国语对白做受欧美| 久久无码一区| 日本三级网| 欧美精品成人| 国产日韩精品无码去免费专区国产| 中文字幕日韩在线观看| 免费操逼视频网站| 亚洲va国产va天堂va久久| 黄片免费观看视频| 日韩无码播放| 安徽妇女BBBWBBBwm| 天堂成人| 五月天婷婷色| 成人在线视频观看| 51无码| 99热免费| 操你久久| 午夜AV大片| 做爱的网站| 青娱乐亚洲精品视频| 久久久精品国产视频| 四川揉BBB搡BBB| 伊人影院在线免费观看| 无码中文字| 欧美成人A片AAA片在线播放| www99精品| 日B免费视频| 成人做爰黄A片免费| 91大神在线看| 天堂一区二区18| 簧片在线免费观看| 亚洲国产成人91PORN| 欧美疯狂做受XXXXX高潮| 欧美亚洲日韩国产| 欧美成人三区性价比| 色婷婷国产| 欧美老女人操逼| 日韩天堂| 亚洲福利在线观看| 麻豆电影| 精品中文一区二区三区| 欧美日韩国产在线| 男人午夜网站| 国产中文字幕免费| 国产午夜精品一区二区三区牛牛 | 精品人妻一区二区三区四区| 青青草手机视频在线| 六月婷婷七月丁香| 99久久成人| 日韩精品无码AV| 日韩网站在线观看| 熟女人妻视频| 日韩小视频在线| 欧美中出| 爱搞搞就搞搞| 九九热精品视频| 无码秘蜜桃一区二区| 国产V精品| 久热只有精品| 亚洲无吗视频| 伊人逼逼| 日本成人高清视频| 久一视频| 午夜男女福利| 黄色免费在线观看视频| 狼友视频在线观看| 91成人情欲影视网| 日韩老熟妇| 日本免费在线观看视频| 欧美亚洲国产一区二区三区 | 精品久久无码| 国产精品视频在线免费观看| 日本一区二区三区在线观看网站| 天天射网| 人妻体内射精一区二区| 中文字幕乱妇无码Av在线| 人人舔视频| 69av电影| 少妇性受XXXX黑人XYX性爽| 100国产精品人妻无码| 亚洲婷婷网| av天堂中文在线| 91精品国产综合久久久蜜臀九色| 97资源在线| av福利电影在线| 精品AV国产| aV一区二区三区| 亚洲肏屄网| 啪啪啪免费| 成人小视频在线观看| 国产成人精品AV| 香蕉成人视频| 国产主播一区二区| 日韩一级片网站| 人人爱人人爽| 日韩成人网址| 国精产品一区二区三区| 午夜免费性爱视频| 一级A片黃色A片| 国产日韩中文字幕| 日韩AV无码专区亚洲AV| 中文字幕日韩视频| 俺去夜| 国产精品视频一区二区三| 色狠狠AV| 天天草天天草| 日本中文在线观看| 免费观看黄色片| 国产黄色三级片| 国产欧美日韩综合| 霸道总裁雷总各种姿势白浆爱情岛论坛| 永久m3u8在线观看| 蜜臀久久99精品久久久兰草影视 | 黄色视频免费网站| 天天操人人| 午夜丁香| 操骚逼视频| 成年人毛片视频| 欧美自拍第一页| 日本一级大片| 五月婷婷丁香综合| 国产成人亚洲日韩| 污视频在线免费| 久久另类TS人妖一区二区免费| 亚洲国产无码在线观看| 国精产品一品二品国精| 中文字幕av久久久久久欧洲尺码 | 玖玖成人电影| 狠狠色婷婷7777| 国产做受精品网站在线观看| www.操逼网| 黑人精品欧美一区二区蜜桃| 亚洲成人综合在线| 操b网站| 国产精品久久久久的角色| 精品丰满人妻一区二区三区免费观| 成人网站三级片| 做爱网| 亚洲AV成人片色在线观看麻豆| 国产一二| 嫩小槡BBBB槡BBBB槡免费-百度 | 精品视频免费在线| 91.www91成人影视在线观看91成人网址9 | 少妇一级| www.伊人大香蕉| 成人不卡在线| av天堂中文在线| 亚洲偷| 亚洲高清视频无码| 97国产精品视频人人做人人爱| 91ThePorn国产在线观看 | 88av在线观看| 99精品视频免费在线观看| 123好逼网| 91人人干| 黄色片免费视频网站| 91无码国产成人精品| 欧美一级黄色大片| 91亚洲电影| 天天爽爽爽爽爽成人片| 一边做一边说国语对白| 亚洲黄色免费电影| 青青草97国产精品麻豆| 香蕉成人视频| 免费在线观看一区| 91ThePorn国产在线观看| 夜夜国自一区| 亚洲色婷| 欧美日韩亚洲一区二区| 国产又色又爽又黄又免费| 中文字幕乱码亚洲中文在线| 日韩AV网站在线观看| 欧美三级网站在线观看| 男人的天堂2019| 日本少妇高清视频| 日本一区二区在线视频| 另类老妇奶BBBBwBB| 亚洲黄色成人网站| 色狠狠AV| 欧美婬乱片A片AAA毛片地址| 国产午夜在线观看| 老妇性BBWBBWBBWBBW| 欧美高清一区二区| 一级一A片一a免费看| 亚洲人人操| 亚洲国产av电影| 青娱乐精品在线| 麻豆人妻换人妻好紧| 免费人成年激情视频在线观看| 婷婷三级| 久久精品一区二区三区蜜芽的特点| 国产小视频在线| 成人性爱视频免费在线观看| 日本久久视频| 亚韩无码| 三级不卡视频| 69成人视频| 亚洲成人无码电影| 操逼网站在线| 久久伊人综合| 91性视频| 麻豆疯狂做受XXXX高潮视频| 久久AV网站| 熟女人妻人妻HD| 黄总av| 色婷五月| 丰满欧美熟妇免费视频| 黄色av免费看| www.黄色com| 亚洲无码在线播放| 亚洲第一a| 操逼网首页123| 日韩电影中文字幕| 人人操人人妻人人| 亚洲成人五月天| 无码高清在线播放| 人妻操逼视频| 国产日韩在线视频| 2015中文字幕黄色视频| 97精品久久| 中文字幕一区二区三区四区在线视频 | 久久国产一级片| 一级A片免费| 国产成人精品AV| 天天操人人操| 超碰人人插| 热久久亚洲中文字幕| 操逼视频一级| 亚洲免费在线视频观看| 亚洲视频网址| 亚洲精品成人无码AV在线| 中文字字幕在线中文乱码电影| 免费aaa| 91麻豆精品传媒| 久久婷婷五月| 翔田千里中文字幕无码| 夜夜狠狠躁日日躁| 婷婷六区|