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

Spring Boot 定義接口的方法是否可以聲明為 private?

開發 前端
調用 setResponseStatus 方法處理@ResponseStatus? 注解,具體的處理邏輯是這樣:如果沒有添加 @ResponseStatus 注解,則什么都不做;如果添加了該注解,并且 reason 屬性不為空,則直接輸出錯誤,否則設置響應狀態碼。這里需要注意一點,如果響應狀態碼是 200,就不要設置 reason,否則會按照 error 處理。

我們在 Controller 中定義接口的時候,一般都是像下面這樣:

@GetMapping("/01")
public String hello(Map<String,Object> map){
map.put("name", "javaboy");
return "forward:/index";
}

估計很少有人會把接口方法定義成 private 的吧?那我們不禁要問,如果非要定義成 private 的方法,那能運行起來嗎?

帶著這個疑問,我們開始今天的源碼解讀~

在我們使用 Spring Boot 的時候,經常會看到 HandlerMethod 這個類型,例如我們在定義攔截器的時候,如果攔截目標是一個方法,則 preHandle 的第三個參數就是 HandlerMethod(以下案例選自松哥之前的視頻:手把手教你 Spring Boot 自定義注解):

@Component
public class IdempotentInterceptor implements HandlerInterceptor {
@Autowired
TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return true;
}
//省略...
return true;
}
//...
}

我們在閱讀 SpringMVC 源碼的時候,也會反復看到這個 HandlerMethod,那么它到底是什么意思?今天我想和小伙伴們捋一捋這個問題,把這個問題搞清楚了,前面的問題大家也就懂了。

1.概覽

圖片

可以看到,HandlerMethod 體系下的類并不多:

HandlerMethod

封裝 Handler 和具體處理請求的 Method。

InvocableHandlerMethod

在 HandlerMethod 的基礎上增加了調用的功能。

ServletInvocableHandlerMethod

在 InvocableHandlerMethod 的基礎上增了對 @ResponseStatus 注解的支持、增加了對返回值的處理。

ConcurrentResultHandlerMethod

在 ServletInvocableHandlerMethod 的基礎上,增加了對異步結果的處理。

基本上就是這四個,接下來松哥就來詳細說一說這四個組件。

2.HandlerMethod

2.1 bridgedMethod

在正式開始介紹 HandlerMethod 之前,想先和大家聊聊 bridgedMethod,因為在 HandlerMethod 中將會涉及到這個東西,而有的小伙伴可能還沒聽說過 bridgedMethod,因此松哥在這里做一個簡單介紹。

首先考考大家,下面這段代碼編譯會報錯嗎?

public interface Animal<T> {
void eat(T t);
}
public class Cat implements Animal<String> {
@Override
public void eat(String s){
System.out.println("cat eat " + s);
}
}
public class Demo01 {
public static void main(String[] args){
Animal animal = new Cat();
animal.eat(new Object());
}
}

首先我們定義了一個 Animal 接口,里邊定義了一個 eat 方法,同時聲明了一個泛型。Cat 實現了 Animal 接口,將泛型也定義為了 String。當我調用的時候,聲明類型是 Animal,實際類型是 Cat,這個時候調 eat 方法傳入了 Object 對象大家猜猜會怎么樣?如果調用 eat 方法時傳入的是 String 類型那就肯定沒問題,但如果不是 String 呢?

松哥先說結論:編譯沒問題,運行報錯。

如果小伙伴們在自己電腦上寫出上面這段代碼,你會發現這樣一個問題,開發工具中提示的參數類型竟然是 Object,以松哥的 IDEA 為例,如下:

圖片

大家看到,在我寫代碼的時候,開發工具會給我提示,這個參數類型是 Object,有的小伙伴會覺得奇怪,明明是泛型,怎么變成 Object 了?

我們可以通過反射查看 Cat 類中到底有哪些方法,代碼如下:

public class Demo01 {
public static void main(String[] args){
Method[] methods = Cat.class.getMethods();
for (Method method : methods) {
String name = method.getName();
Class<?>[] parameterTypes = method.getParameterTypes();
System.out.println(name+"("+ Arrays.toString(parameterTypes) +")");
}
}
}

運行結果如下:

圖片

可以看到,在實際運行過程中,竟然有兩個 eat 方法,一個的參數為 String 類型,另一個參數為 Object 類型,這是怎么回事呢?

這個參數類型為 Object 的方法其實是 Java 虛擬機在運行時創建出來的,這個方法就是我們所說的 bridge method。本節的小標題叫做 bridgedMethod,這是 HandlerMethod 源碼中的變量名,bridge 結尾多了一個 d,含義變成了被 bridge 的方法,也就是參數為 String 的原方法,大家在接下來的源碼中看到了 bridgedMethod 就知道這表示參數類型不變的原方法。

2.2 HandlerMethod 介紹

接下來我們來簡單看下 HandlerMethod。

在我們前面分析 HandlerMapping 的時候(參見:),里邊有涉及到 HandlerMethod,創建 HandlerMethod 的入口方法是 createWithResolvedBean,因此這里我們就從該方法開始看起:

public HandlerMethod createWithResolvedBean(){
Object handler = this.bean;
if (this.bean instanceof String) {
String beanName = (String) this.bean;
handler = this.beanFactory.getBean(beanName);
}
return new HandlerMethod(this, handler);
}

這個方法主要是確認了一下 handler 的類型,如果 handler 是 String 類型,則根據 beanName 從 Spring 容器中重新查找到 handler 對象,然后構建 HandlerMethod:

private HandlerMethod(HandlerMethod handlerMethod, Object handler){
this.bean = handler;
this.beanFactory = handlerMethod.beanFactory;
this.beanType = handlerMethod.beanType;
this.method = handlerMethod.method;
this.bridgedMethod = handlerMethod.bridgedMethod;
this.parameters = handlerMethod.parameters;
this.responseStatus = handlerMethod.responseStatus;
this.responseStatusReason = handlerMethod.responseStatusReason;
this.resolvedFromHandlerMethod = handlerMethod;
this.description = handlerMethod.description;
}

這里的參數都比較簡單,沒啥好說的,唯一值得介紹的地方有兩個:parameters 和 responseStatus。

parameters

parameters 實際上就是方法參數,對應的類型是 MethodParameter,這個類的源碼我這里就不貼出來了,主要和大家說一下封裝的內容包括:參數的序號(parameterIndex),參數嵌套級別(nestingLevel),參數類型(parameterType),參數的注解(parameterAnnotations),參數名稱查找器(parameterNameDiscoverer),參數名稱(parameterName)等。

HandlerMethod 中還提供了兩個內部類來封裝 MethodParameter,分別是:

HandlerMethodParameter:這個封裝方法調用的參數。

ReturnValueMethodParameter:這個繼承自 HandlerMethodParameter,它封裝了方法的返回值,返回值里邊的 parameterIndex 是 -1。

注意,這兩者中的 method 都是 bridgedMethod。

responseStatus

這個主要是處理方法的 @ResponseStatus 注解,這個注解用來描述方法的響應狀態碼,使用方式像下面這樣:

@GetMapping("/04")
@ResponseBody
@ResponseStatus(code = HttpStatus.OK)
public void hello4(@SessionAttribute("name"){
System.out.println("name = " + name);
}

從這段代碼中大家可以看到,其實 @ResponseStatus 注解靈活性很差,不實用,當我們定義一個接口的時候,很難預知到該接口的響應狀態碼是 200。

在 handlerMethod 中,在調用其構造方法的時候,都會調用 evaluateResponseStatus 方法處理 @ResponseStatus 注解,如下:

private void evaluateResponseStatus(){
ResponseStatus annotation = getMethodAnnotation(ResponseStatus.class);
if (annotation == null) {
annotation = AnnotatedElementUtils.findMergedAnnotation(getBeanType(), ResponseStatus.class);
}
if (annotation != null) {
this.responseStatus = annotation.code();
this.responseStatusReason = annotation.reason();
}
}

可以看到,這段代碼也比較簡單,找到注解,把里邊的值解析出來,賦值給相應的變量。

這下小伙伴們應該明白了 HandlerMethod 大概是個怎么回事。

3.InvocableHandlerMethod

看名字就知道,InvocableHandlerMethod 可以調用 HandlerMethod 中的具體方法,也就是 bridgedMethod。我們先來看下 InvocableHandlerMethod 中聲明的屬性:

private HandlerMethodArgumentResolverComposite resolvers = new HandlerMethodArgumentResolverComposite();
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
@Nullable
private WebDataBinderFactory dataBinderFactory;

主要就是這三個屬性:

resolvers:這個不用說,參數解析器,前面的文章中松哥已經和大家聊過這個問題了。

parameterNameDiscoverer:這個用來獲取參數名稱,在 MethodParameter 中會用到。

dataBinderFactory:這個用來創建 WebDataBinder,在參數解析器中會用到。

具體的請求調用方法是 invokeForRequest,我們一起來看下:

@Nullable
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
return doInvoke(args);
}
@Nullable
protected Object doInvoke(Object... args) throws Exception {
Method method = getBridgedMethod();
ReflectionUtils.makeAccessible(method);
try {
if (KotlinDetector.isSuspendingFunction(method)) {
return CoroutinesUtils.invokeSuspendingFunction(method, getBean(), args);
}
return method.invoke(getBean(), args);
}
catch (InvocationTargetException ex) {
// 省略 ...
}
}

首先調用 getMethodArgumentValues 方法按順序獲取到所有參數的值,這些參數值組成一個數組,然后調用 doInvoke 方法執行,在 doInvoke 方法中,首先獲取到 bridgedMethod,并設置其可見(意味著我們在 Controller 中定義的接口方法也可以是 private 的),然后直接通過反射調用即可。當我們沒看 SpringMVC 源碼的時候,我們就知道接口方法最終肯定是通過反射調用的,現在,經過層層分析之后,終于在這里找到了反射調用代碼。

最后松哥再來說一下負責參數解析的 getMethodArgumentValues 方法:

protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
MethodParameter[] parameters = getMethodParameters();
if (ObjectUtils.isEmpty(parameters)) {
return EMPTY_ARGS;
}
Object[] args = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
MethodParameter parameter = parameters[i];
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
args[i] = findProvidedArgument(parameter, providedArgs);
if (args[i] != null) {
continue;
}
if (!this.resolvers.supportsParameter(parameter)) {
throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));
}
try {
args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
}
catch (Exception ex) {
// 省略...
}
}
return args;
}
  • 首先調用 getMethodParameters 方法獲取到方法的所有參數。
  • 創建 args 數組用來保存參數的值。
  • 接下來一堆初始化配置。
  • 如果 providedArgs 中提供了參數值,則直接賦值。
  • 查看是否有參數解析器支持當前參數類型,如果沒有,直接拋出異常。
  • 調用參數解析器對參數進行解析,解析完成后,賦值。

是不是,很 easy!

4.ServletInvocableHandlerMethod

ServletInvocableHandlerMethod 則是在 InvocableHandlerMethod 的基礎上,又增加了兩個功能:

  • 對@ResponseStatus 注解的處理
  • 對返回值的處理

Servlet 容器下 Controller 在查找適配器時發起調用的最終就是 ServletInvocableHandlerMethod。

這里的處理核心方法是 invokeAndHandle,如下:

public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
setResponseStatus(webRequest);
if (returnValue == null) {
if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {
disableContentCachingIfNecessary(webRequest);
mavContainer.setRequestHandled(true);
return;
}
}
else if (StringUtils.hasText(getResponseStatusReason())) {
mavContainer.setRequestHandled(true);
return;
}
mavContainer.setRequestHandled(false);
try {
this.returnValueHandlers.handleReturnValue(
returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}
catch (Exception ex) {
throw ex;
}
}

首先調用父類的 invokeForRequest 方法對請求進行執行,拿到請求結果。

調用 setResponseStatus 方法處理@ResponseStatus? 注解,具體的處理邏輯是這樣:如果沒有添加 @ResponseStatus 注解,則什么都不做;如果添加了該注解,并且 reason 屬性不為空,則直接輸出錯誤,否則設置響應狀態碼。這里需要注意一點,如果響應狀態碼是 200,就不要設置 reason,否則會按照 error 處理。

接下來就是對返回值的處理了,returnValueHandlers#handleReturnValue 方法松哥在之前的文章中和大家專門介紹過,這里就不再贅述,傳送門:Spring Boot 中如何統一 API 接口響應格式?。

事實上,ServletInvocableHandlerMethod 還有一個子類 ConcurrentResultHandlerMethod,這個支持異步調用結果處理,因為使用場景較少,這里就不做介紹啦。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2022-08-26 01:02:31

接口privateSpring

2021-04-16 11:02:40

Spring BootprivateJava

2023-03-16 08:14:57

2025-05-28 03:00:00

2022-07-07 14:18:43

SpringWeb應用設計

2023-10-16 11:12:29

2024-10-18 08:00:00

SpringBoot框架開發

2024-10-14 17:18:27

2025-09-29 02:11:00

接口SpringController

2022-06-04 12:25:10

解密加密過濾器

2021-03-09 13:18:53

加密解密參數

2024-08-01 09:10:03

2022-07-27 08:49:34

接口加密解密

2025-09-26 05:00:00

2010-10-27 16:41:40

2025-01-08 09:35:55

Spring性能監控

2009-06-22 09:01:57

Spring聲明式事務

2024-09-27 15:24:15

Spring數據加解密

2025-06-06 08:28:56

2025-02-22 08:00:00

AgentSpringBootJava
點贊
收藏

51CTO技術棧公眾號

亚洲国产一区二区视频| 制服丝袜在线第一页| 中文字幕一区二区三区人妻电影| h网站在线免费观看| 亚洲精品一区二区三区中文字幕| 国产亚洲亚洲| 日韩一区二区免费视频| 日韩在线三区| 中文字幕在线看人| 欧美大片网址| 亚洲一区免费在线观看| 精品一区国产| 国产精品第九页| 亚洲午夜免费| 日本精品一区二区三区高清| 久久99精品国产99久久| 精品少妇一二三区| 国产精品宾馆| 婷婷丁香久久五月婷婷| 精品一区久久| 国产精品久久欧美久久一区| 91综合久久一区二区| 欧美性受极品xxxx喷水| 神马一区二区影院| 中文字幕欧美人妻精品一区蜜臀| 成人在线免费视频观看| 欧美日韩亚洲综合一区二区三区| 亚洲不卡一卡2卡三卡4卡5卡精品| 天天综合天天干| 外国成人在线视频| 色婷婷久久99综合精品jk白丝| 欧美激情专区| 日本一本在线观看| 日韩精品一区二区三区免费观影 | 无码免费一区二区三区免费播放| 精品人妻一区二区三区四区不卡| 欧美午夜一区二区福利视频| 精品日韩av一区二区| 日本中文字幕在线视频观看| 色呦呦中文字幕| 久久一综合视频| 视频一区视频二区国产精品| www.国产福利| sis001亚洲原创区| 91美女蜜桃在线| 国产精品亚洲自拍| 欧美精品一区二区蜜桃| 欧美爱爱网站| 亚洲精品在线电影| 欧美xxxxx在线视频| 日本免费在线观看| 波波电影院一区二区三区| 日韩免费高清在线观看| 国产真实乱在线更新| 精品国产导航| 欧美日韩一区三区四区| 国产免费人做人爱午夜视频| 国产在线视频福利| 国产精品亚洲一区二区三区妖精| 91精品国产91久久久久久| 少妇视频在线播放| 国产精品中文字幕制服诱惑| 精品久久久久久久人人人人传媒| 韩国三级在线看| 奇米777日韩| 亚洲男人天堂一区| 欧美精品一区二区三区四区五区| 性感美女一级片| 久久精品99国产精品| 性亚洲最疯狂xxxx高清| 精品自拍偷拍视频| 国产毛片一区二区三区| 日韩限制级电影在线观看| 日本网站在线看| 免费观看成人性生生活片| 一级做a爱片久久| 日本一区二区三区视频在线播放| 亚洲精品一区二区三区区别| 久久国内精品视频| 亚洲xxxxx| 亚洲一区二区三区视频| 熟女丰满老熟女熟妇| 国产又色又爽又黄刺激在线视频| 99久久99久久久精品棕色圆| 成人福利一区二区| 亚洲人成7777| 欧美成人在线直播| y111111国产精品久久婷婷| 日韩女同强女同hd| 国产精品福利在线观看播放| 日韩av一区二区在线| 爽爽爽在线观看| 在线播放一区二区精品视频| 国产亚洲二区| 国产亚洲精品久久久久久豆腐| av综合网站| 欧美日韩视频在线一区二区| 91丝袜超薄交口足| 日韩aaa久久蜜桃av| 中文字幕欧美日韩| 大又大又粗又硬又爽少妇毛片 | av在线播放一区| 日韩片之四级片| 天天躁日日躁aaaa视频| 日韩一级电影| 久久人人爽人人爽爽久久| 国产三级在线观看完整版| 欧美三级网页| 国产成人综合精品| yjizz国产| 欧美成人黑人| 成人av电影在线网| 欧美一区1区三区3区公司| 欧美a在线看| 大陆成人av片| 99精品99久久久久久宅男| 人成在线免费视频| 91蜜桃婷婷狠狠久久综合9色| 久久亚洲精品一区| 手机av在线网站| 日韩精品福利一区二区三区| 久久香蕉国产线看观看av| 日韩精品在线观看免费| 深夜福利91大全| 亚洲成人aaa| 午夜免费高清视频| 99久久er| 日韩国产欧美精品一区二区三区| 在线免费观看亚洲视频| 美日韩一区二区三区| 国产精品稀缺呦系列在线| 午夜一区在线观看| 亚洲韩国一区二区三区| 天堂网成人在线| 欧美在线一级| 欧美一级视频精品观看| 成人一区二区三区仙踪林| 欧洲福利电影| 久青草国产97香蕉在线视频| 国产精品成人久久久| 精品一区二区久久久| 国产99久久久欧美黑人| 日本黄视频在线观看| 91麻豆精品在线观看| 国产日本在线播放| gogo人体一区| 欧美极品少妇全裸体| 日韩视频在线观看一区| 91在线你懂得| 亚洲第一精品区| segui88久久综合| 精品福利在线导航| 久久视频免费在线观看| 日韩精品福利网| 91精品国产综合久久久久久丝袜 | 国产成人久久久久| 精品一区二区三区免费视频| 男女爱爱视频网站| 国产不卡123| 欧美精品日韩一区| 欧美精品欧美极品欧美激情| 日韩大片在线观看| 国产精品久久久久久久久免费| 国产成人三级一区二区在线观看一| 成人aa视频在线观看| 99热亚洲精品| 国产精品视频一区二区三区综合 | 富二代精品短视频| 国产aⅴ爽av久久久久| 久久久伦理片| 日本精品视频在线| 91视频在线观看| 香蕉乱码成人久久天堂爱免费| 国产精品自拍视频在线| 天海翼精品一区二区三区| 欧美一级成年大片在线观看 | 欧美精品一区二区三区很污很色的 | 亚洲激情图片一区| 狠狠热免费视频| 999成人精品视频线3| 97超级碰碰| 中文在线资源| 精品成人一区二区三区四区| 亚洲 欧美 日韩 综合| 国产日韩欧美一区二区三区乱码| 九九爱精品视频| 一区二区美女| 7777免费精品视频| 大乳在线免费观看| 高潮白浆女日韩av免费看| 黄大色黄女片18免费| 另类亚洲自拍| 久久久久久久久一区| 欧美一区=区三区| 91精品国产高清久久久久久久久| 国产高清一区在线观看| 日韩欧美国产三级| 精品人妻一区二区三区潮喷在线 | 国产无人区码熟妇毛片多| 国产女主播视频一区二区| 久久婷婷五月综合色国产香蕉| 国产精品白丝av嫩草影院| 国产精品久久中文| av日韩国产| 久久亚洲影音av资源网 | 久久久精品2019中文字幕神马| 日批视频在线播放| 制服视频三区第一页精品| 日韩黄色中文字幕| 不卡视频一二三| 中文字幕 欧美日韩| 亚洲综合电影一区二区三区| 精品欧美一区二区精品久久| 成人国产精品一区二区网站| 日本道色综合久久影院| 精品乱码一区二区三四区视频| 日韩午夜激情免费电影| 老熟妇一区二区三区啪啪| 香蕉乱码成人久久天堂爱免费| 四虎精品免费视频| 国产日韩欧美麻豆| 午夜一区二区三区免费| 成人黄色777网| 杨幂一区二区国产精品| 美女精品一区二区| 欧美黄色一级片视频| 最新日韩av| 免费在线观看91| 成人免费在线观看视频| 欧美一二三视频| 久久亚洲免费| 青草av在线| 欧美日韩在线播放三区四区| 国产精品99精品| 91中文字幕精品永久在线| 欧美日韩国产免费一区二区三区| 另类春色校园亚洲| 国产精品一区二区三区四区五区| h片在线观看下载| 欧美美最猛性xxxxxx| 特黄视频在线观看| 欧美va亚洲va香蕉在线| 精品美女www爽爽爽视频| 欧美一区二区视频在线观看2022| 国产又黄又粗又猛又爽| 欧美人妇做爰xxxⅹ性高电影| www.综合| 欧美一区二区三区的| 在线观看中文字幕码| 337p粉嫩大胆色噜噜噜噜亚洲| 国偷自产av一区二区三区麻豆| 国产一区视频在线看| 欧美男女爱爱视频| 亚洲小说区图片区| 日韩欧美亚洲v片| 凹凸成人精品亚洲精品密奴| 91成人免费在线视频| 少妇愉情理伦三级| 国产精品蜜臀av| 视频免费在线观看| 欧美a级理论片| 天天影视综合色| 精品影视av免费| 日本成人在线免费观看| 老妇喷水一区二区三区| 最近免费中文字幕中文高清百度| 日日夜夜免费精品视频| 日本高清久久久| 国产成人超碰人人澡人人澡| 能在线观看的av网站| 日韩成人免费电影| caoporm在线视频| 国产成人av资源| 丰满大乳奶做爰ⅹxx视频| 国产亚洲女人久久久久毛片| 网站永久看片免费| 一区二区三区**美女毛片| 国产成人精品一区二三区| 在线国产电影不卡| 国产白浆在线观看| 亚洲韩国青草视频| 成人激情四射网| 日韩电影中文字幕| 亚洲欧美视频一区二区| 啊v视频在线一区二区三区| 国产九九在线| 久久资源免费视频| 美女视频在线免费| 欧美精品videosex牲欧美| 国模冰冰炮一区二区| …久久精品99久久香蕉国产| 四虎4545www精品视频| 日av在线播放中文不卡| 四虎地址8848精品| 精品国产91亚洲一区二区三区www| 精品高清久久| 日韩人妻无码精品久久久不卡| 日韩专区中文字幕一区二区| 乱码一区二区三区| 欧美国产97人人爽人人喊| 手机看片日韩av| 亚洲综合自拍偷拍| 男人天堂视频网| 在线观看欧美精品| 欧美性猛交 xxxx| 色悠悠久久久久| 欧美xx视频| 国产亚洲福利社区| 91精品啪在线观看国产18| 国产又粗又爽又黄的视频| 乱码第一页成人| 岛国精品一区二区三区| 成人午夜视频在线观看| 五月婷婷六月香| 色综合久久66| 日本精品一二区| 久久成年人视频| 日本欧美在线| 色播五月综合| 视频一区在线视频| 亚洲综合自拍网| 亚洲成人av福利| 国产精品suv一区| 欧美精品一区在线观看| 18加网站在线| 97免费中文视频在线观看| 国产精品久久久久久av公交车| 婷婷四房综合激情五月| 美女精品网站| www.久久av| 亚洲欧美在线视频观看| 久久网免费视频| 91麻豆精品国产91久久久更新时间 | xxxxxx欧美| 蜜桃91精品入口| 亚洲在线视频| 国产精品久久无码| 精品国产精品自拍| 天天av天天翘| 97国产精品视频人人做人人爱| 国产成人高清精品免费5388| 日韩精品一区二区免费| 午夜一区不卡| 欲求不满的岳中文字幕| 午夜精品久久久久久久| 无码国精品一区二区免费蜜桃| 97精品国产97久久久久久春色| 风间由美中文字幕在线看视频国产欧美 | 成人黄色网免费| 999久久精品| 性一交一乱一伧国产女士spa| 成人性色生活片| 日韩特黄一级片| 亚洲精品中文字幕av| 超碰人人在线| 国产999精品久久久| 成久久久网站| 狠狠操狠狠干视频| 亚洲人精品午夜| 亚洲免费一级片| 色综久久综合桃花网| 亚洲伊人精品酒店| 蜜桃免费一区二区三区| 久久最新视频| 日本女人性生活视频| 欧美一级黄色片| bl在线肉h视频大尺度| 免费日韩av电影| 精品亚洲porn| 国产精品2020| 亚洲欧洲国产精品| freexxx性亚洲精品| 久久天天狠狠| 久久国产精品99久久人人澡| 欧美日韩免费做爰视频| 欧美三级乱人伦电影| 含羞草www国产在线视频| 国产精品高清免费在线观看| 女人抽搐喷水高潮国产精品| 国产嫩草在线观看| 亚洲乱码精品一二三四区日韩在线| 国产手机视频在线| 7m第一福利500精品视频| 成人国产精品一级毛片视频| av地址在线观看| 日本韩国视频一区二区| 国产写真视频在线观看| 久久久久免费网| 国内精品视频666| 久久久久久久极品| www.亚洲男人天堂| 欧美日韩一区二区三区在线电影| 伊人影院综合在线| 狠狠躁夜夜躁人人躁婷婷91| 哥也色在线视频| 免费h精品视频在线播放| 国产精品一区二区在线观看不卡 | 亚洲欧美激情一区| 亚洲美女炮图| 只有这里有精品|