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

Spring Cloud Gateway CORS 方案 一次說清楚

開發(fā)
CORS跨域是一個開發(fā)中經(jīng)常會遇到的問題,在SpringBoot單體項目中我們只需要添加一個Filter即可解決,而在SpringCloud微服務(wù)中并非如此順利,希望通過本文可以幫你一次解決。

CORS跨域是一個開發(fā)中經(jīng)常會遇到的問題,在SpringBoot單體項目中我們只需要添加一個Filter即可解決,而在SpringCloud微服務(wù)中并非如此順利,希望通過本文可以幫你一次解決~

問題

在Spring Cloud項目中,前后端分離目前很常見,在調(diào)試時,會遇到兩種情況的跨域:

(1) 前端頁面通過不同域名或IP訪問微服務(wù)的后臺,例如前端人員會在本地起HttpServer 直連后臺開發(fā)本地起的服務(wù),此時,如果不加任何配置,前端頁面的請求會被瀏覽器跨域限制攔截,所以,業(yè)務(wù)服務(wù)常常會添加如下代碼設(shè)置全局跨域:

@Bean
public CorsFilter corsFilter() {
    logger.debug("CORS限制打開");
    CorsConfiguration config = new CorsConfiguration();
    # 僅在開發(fā)環(huán)境設(shè)置為*
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    config.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
    configSource.registerCorsConfiguration("/**", config);
    return new CorsFilter(configSource);
}

(2) 前端頁面通過不同域名或IP訪問SpringCloud Gateway,例如前端人員在本地起HttpServer直連服務(wù)器的Gateway進(jìn)行調(diào)試。此時,同樣會遇到跨域。需要在Gateway的配置文件中增加:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
        # 僅在開發(fā)環(huán)境設(shè)置為*
          '[/**]':
            allowedOrigins: "*"
            allowedHeaders: "*"
            allowedMethods: "*"

那么,此時直連微服務(wù)和網(wǎng)關(guān)的跨域問題都解決了,是不是很完美?

No~ 問題來了,前端仍然會報錯:“不允許有多個’Access-Control-Allow-Origin’ CORS頭”。

Access to XMLHttpRequest at 'http://192.168.2.137:8088/api/two' from origin 'http://localhost:3200' has been blocked by CORS policy: 
The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost:3200', but only one is allowed.

仔細(xì)查看返回的響應(yīng)頭,里面包含了兩份Access-Control-Allow-Origin頭。

我們用客戶端版的PostMan做一個模擬,在請求里設(shè)置頭:Origin : * ,查看返回結(jié)果的頭:

不能用Chrome插件版,由于瀏覽器的限制,插件版設(shè)置Origin的Header是無效的

發(fā)現(xiàn)問題了:

Vary 和 Access-Control-Allow-Origin 兩個頭重復(fù)了兩次,其中瀏覽器對后者有唯一性限制!

分析

Spring Cloud Gateway是基于SpringWebFlux的,所有web請求首先是交給DispatcherHandler進(jìn)行處理的,將HTTP請求交給具體注冊的handler去處理。

我們知道Spring Cloud Gateway進(jìn)行請求轉(zhuǎn)發(fā),是在配置文件里配置路由信息,一般都是用url predicates模式,對應(yīng)的就是RoutePredicateHandlerMapping 。所以,DispatcherHandler會把請求交給 RoutePredicateHandlerMapping.

那么,接下來看下 RoutePredicateHandlerMapping.getHandler(ServerWebExchange exchange) 方法,默認(rèn)提供者是其父類 AbstractHandlerMapping :

@Override
 public Mono<Object> getHandler(ServerWebExchange exchange) {
  return getHandlerInternal(exchange).map(handler -> {
   if (logger.isDebugEnabled()) {
    logger.debug(exchange.getLogPrefix() + "Mapped to " + handler);
   }
   ServerHttpRequest request = exchange.getRequest();
   // 可以看到是在這一行就進(jìn)行CORS判斷,兩個條件:
   // 1. 是否配置了CORS,如果不配的話,默認(rèn)是返回false的
   // 2. 或者當(dāng)前請求是OPTIONS請求,且頭里包含ORIGIN和ACCESS_CONTROL_REQUEST_METHOD
   if (hasCorsConfigurationSource(handler) || CorsUtils.isPreFlightRequest(request)) {
    CorsConfiguration config = (this.corsConfigurationSource != null ? this.corsConfigurationSource.getCorsConfiguration(exchange) : null);
    CorsConfiguration handlerConfig = getCorsConfiguration(handler, exchange);
    config = (config != null ? config.combine(handlerConfig) : handlerConfig);
    //此處交給DefaultCorsProcessor去處理了
    if (!this.corsProcessor.process(config, exchange) || CorsUtils.isPreFlightRequest(request)) {
     return REQUEST_HANDLED_HANDLER;
    }
   }
   return handler;
  });
 }

網(wǎng)上有些關(guān)于修改Gateway的CORS設(shè)定的方式,是跟前面SpringBoot一樣,實現(xiàn)一個CorsWebFilter的Bean,靠寫代碼提供 CorsConfiguration ,而不是修改Gateway的配置文件。其實本質(zhì),都是將配置交給corsProcessor去處理,殊途同歸。但靠配置解決永遠(yuǎn)比hard code來的優(yōu)雅。

該方法把Gateway里定義的所有的 GlobalFilter 加載進(jìn)來,作為handler返回,但在返回前,先進(jìn)行CORS校驗,獲取配置后,交給corsProcessor去處理,即DefaultCorsProcessor類

看下DefaultCorsProcessor的process方法:

@Override
public boolean process(@Nullable CorsConfiguration config, ServerWebExchange exchange) {

    ServerHttpRequest request = exchange.getRequest();
    ServerHttpResponse response = exchange.getResponse();
    HttpHeaders responseHeaders = response.getHeaders();

    List<String> varyHeaders = responseHeaders.get(HttpHeaders.VARY);
    if (varyHeaders == null) {
        // 第一次進(jìn)來時,肯定是空,所以加了一次VERY的頭,包含ORIGIN, ACCESS_CONTROL_REQUEST_METHOD和ACCESS_CONTROL_REQUEST_HEADERS
        responseHeaders.addAll(HttpHeaders.VARY, VARY_HEADERS);
    }
    else {
        for (String header : VARY_HEADERS) {
            if (!varyHeaders.contains(header)) {
                responseHeaders.add(HttpHeaders.VARY, header);
            }
        }
    }

    if (!CorsUtils.isCorsRequest(request)) {
        return true;
    }

    if (responseHeaders.getFirst(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) != null) {
        logger.trace("Skip: response already contains \"Access-Control-Allow-Origin\"");
        return true;
    }

    boolean preFlightRequest = CorsUtils.isPreFlightRequest(request);
    if (config == null) {
        if (preFlightRequest) {
            rejectRequest(response);
            return false;
        }
        else {
            return true;
        }
    }

    return handleInternal(exchange, config, preFlightRequest);
}

// 在這個類里進(jìn)行實際的CORS校驗和處理
protected boolean handleInternal(ServerWebExchange exchange,
                                 CorsConfiguration config, boolean preFlightRequest) {

    ServerHttpRequest request = exchange.getRequest();
    ServerHttpResponse response = exchange.getResponse();
    HttpHeaders responseHeaders = response.getHeaders();

    String requestOrigin = request.getHeaders().getOrigin();
    String allowOrigin = checkOrigin(config, requestOrigin);
    if (allowOrigin == null) {
        logger.debug("Reject: '" + requestOrigin + "' origin is not allowed");
        rejectRequest(response);
        return false;
    }

    HttpMethod requestMethod = getMethodToUse(request, preFlightRequest);
    List<HttpMethod> allowMethods = checkMethods(config, requestMethod);
    if (allowMethods == null) {
        logger.debug("Reject: HTTP '" + requestMethod + "' is not allowed");
        rejectRequest(response);
        return false;
    }

    List<String> requestHeaders = getHeadersToUse(request, preFlightRequest);
    List<String> allowHeaders = checkHeaders(config, requestHeaders);
    if (preFlightRequest && allowHeaders == null) {
        logger.debug("Reject: headers '" + requestHeaders + "' are not allowed");
        rejectRequest(response);
        return false;
    }
    //此處添加了AccessControllAllowOrigin的頭
    responseHeaders.setAccessControlAllowOrigin(allowOrigin);

    if (preFlightRequest) {
        responseHeaders.setAccessControlAllowMethods(allowMethods);
    }

    if (preFlightRequest && !allowHeaders.isEmpty()) {
        responseHeaders.setAccessControlAllowHeaders(allowHeaders);
    }

    if (!CollectionUtils.isEmpty(config.getExposedHeaders())) {
        responseHeaders.setAccessControlExposeHeaders(config.getExposedHeaders());
    }

    if (Boolean.TRUE.equals(config.getAllowCredentials())) {
        responseHeaders.setAccessControlAllowCredentials(true);
    }

    if (preFlightRequest && config.getMaxAge() != null) {
        responseHeaders.setAccessControlMaxAge(config.getMaxAge());
    }

    return true;
}

可以看到,在DefaultCorsProcessor 中,根據(jù)我們在appliation.yml 中的配置,給Response添加了 Vary 和 Access-Control-Allow-Origin 的頭。

再接下來就是進(jìn)入各個GlobalFilter進(jìn)行處理了,其中NettyRoutingFilter 是負(fù)責(zé)實際將請求轉(zhuǎn)發(fā)給后臺微服務(wù),并獲取Response的,重點看下代碼中filter的處理結(jié)果的部分:

其中以下幾種header會被過濾掉的:

很明顯,在圖里的第3步中,如果后臺服務(wù)返回的header里有 Vary 和 Access-Control-Allow-Origin ,這時由于是putAll,沒有做任何去重就加進(jìn)去了,必然會重復(fù),看看DEBUG結(jié)果驗證一下:

驗證了前面的發(fā)現(xiàn)。

解決

解決的方案有兩種:

(1) 利用 DedupeResponseHeader 配置:

spring:
    cloud:
        gateway:
          globalcors:
            cors-configurations:
              '[/**]':
                allowedOrigins: "*"
                allowedHeaders: "*"
                allowedMethods: "*"
          default-filters:
          - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST

DedupeResponseHeader 加上以后會啟用DedupeResponseHeaderGatewayFilterFactory 在其中,dedupe方法可以按照給定策略處理值

private void dedupe(HttpHeaders headers, String name, Strategy strategy) {
  List<String> values = headers.get(name);
  if (values == null || values.size() <= 1) {
   return;
  }
  switch (strategy) {
  // 只保留第一個
  case RETAIN_FIRST:
   headers.set(name, values.get(0));
   break;
  // 保留最后一個        
  case RETAIN_LAST:
   headers.set(name, values.get(values.size() - 1));
   break;
  // 去除值相同的
  case RETAIN_UNIQUE:
   headers.put(name, values.stream().distinct().collect(Collectors.toList()));
   break;
  default:
   break;
  }
 }
  • 如果請求中設(shè)置的Origin的值與我們自己設(shè)置的是同一個,例如生產(chǎn)環(huán)境設(shè)置的都是自己的域名xxx.com或者開發(fā)測試環(huán)境設(shè)置的都是*(瀏覽器中是無法設(shè)置Origin的值,設(shè)置了也不起作用,瀏覽器默認(rèn)是當(dāng)前訪問地址),那么可以選用RETAIN_UNIQUE策略,去重后返回到前端。
  • 如果請求中設(shè)置的Oringin的值與我們自己設(shè)置的不是同一個,RETAIN_UNIQUE策略就無法生效,比如 ”*“ 和 ”xxx.com“是兩個不一樣的Origin,最終還是會返回兩個Access-Control-Allow-Origin 的頭。此時,看代碼里,response的header里,先加入的是我們自己配置的Access-Control-Allow-Origin的值,所以,我們可以將策略設(shè)置為RETAIN_FIRST ,只保留我們自己設(shè)置的。

大多數(shù)情況下,我們想要返回的是我們自己設(shè)置的規(guī)則,所以直接使用RETAIN_FIRST 即可。實際上,DedupeResponseHeader 可以針對所有頭,做重復(fù)的處理。

(2) 手動寫一個 CorsResponseHeaderFilter 的 GlobalFilter 去修改Response中的頭。

@Component
public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {

    private static final Logger logger = LoggerFactory.getLogger(CorsResponseHeaderFilter.class);

    private static final String ANY = "*";

    @Override
    public int getOrder() {
        // 指定此過濾器位于NettyWriteResponseFilter之后
        // 即待處理完響應(yīng)體后接著處理響應(yīng)頭
        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
    }

    @Override
    @SuppressWarnings("serial")
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            exchange.getResponse().getHeaders().entrySet().stream()
                    .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
                    .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
                            || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)
                            || kv.getKey().equals(HttpHeaders.VARY)))
                    .forEach(kv ->
                    {
                        // Vary只需要去重即可
                        if(kv.getKey().equals(HttpHeaders.VARY))
                            kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));
                        else{
                            List<String> value = new ArrayList<>();
                            if(kv.getValue().contains(ANY)){  //如果包含*,則取*
                                value.add(ANY);
                                kv.setValue(value);
                            }else{
                                value.add(kv.getValue().get(0)); // 否則默認(rèn)取第一個
                                kv.setValue(value);
                            }
                        }
                    });
        }));
    }
}

此處有兩個地方要注意:

(1) 根據(jù)下圖可以看到,在取得返回值后,F(xiàn)ilter的Order 值越大,越先處理Response,而真正將Response返回到前端的,是 NettyWriteResponseFilter, 我們要想在它之前修改Response,則Order 的值必須比NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER 大。

(2) 修改后置filter時,網(wǎng)上有些博客使用的是 Mono.defer去做的,這種做法,會從此filter開始,重新執(zhí)行一遍它后面的其他filter,一般我們會添加一些認(rèn)證或鑒權(quán)的 GlobalFilter ,就需要在這些filter里用ServerWebExchangeUtils.isAlreadyRouted(exchange) 方法去判斷是否重復(fù)執(zhí)行,否則可能會執(zhí)行二次重復(fù)操作,所以建議使用fromRunnable 避免這種情況

責(zé)任編輯:趙寧寧 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2025-05-23 10:00:00

網(wǎng)絡(luò)交換機(jī)STP

2021-04-08 15:07:51

低代碼開發(fā)平臺

2020-03-02 15:17:37

云原生CNCF容器

2019-07-04 09:13:04

中臺百度團(tuán)隊

2021-02-25 08:21:38

高可用風(fēng)險故障

2018-11-28 11:08:30

并查集集合數(shù)據(jù)結(jié)構(gòu)

2022-07-21 21:19:48

元宇宙

2021-02-11 08:08:09

Spring Boot配置架構(gòu)

2020-10-29 10:35:53

Nginx架構(gòu)服務(wù)器

2019-12-06 09:16:23

Linux 開源操作系統(tǒng)

2020-04-15 16:34:48

大數(shù)據(jù)質(zhì)量標(biāo)準(zhǔn)

2025-05-28 02:00:00

AI智能體文本

2023-01-26 01:09:31

配置數(shù)據(jù)源參數(shù)

2025-07-09 03:10:00

倒排索引檢索

2019-10-21 08:51:41

分布式事務(wù)CAPAP

2018-07-26 09:06:29

Java內(nèi)存模型

2023-10-27 15:31:04

For循環(huán)Foreach循環(huán)

2022-11-11 15:49:41

MySQL隔離

2020-01-13 15:34:10

超融合邊緣計算架構(gòu)

2023-03-28 07:51:56

CPU主板平臺
點贊
收藏

51CTO技術(shù)棧公眾號

欧美激情精品| 三级在线观看| 成人在线播放免费观看| 寂寞少妇一区二区三区| 欧美猛交ⅹxxx乱大交视频| 国产精品久久久久久在线观看| 日韩av影片| 亚洲同性gay激情无套| 国产精品视频500部| 亚洲婷婷久久综合| 激情欧美丁香| 色噜噜亚洲精品中文字幕| 国产精品91av| 国产成人a视频高清在线观看| 一区二区三区美女视频| 欧美一区二区三区精美影视| 精品人妻无码一区二区三区蜜桃一 | 一本久久综合亚洲鲁鲁五月天| 伊人久久99| 欧美新色视频| 成人听书哪个软件好| 国产美女高潮久久白浆| 欧美h在线观看| 欧美三级乱码| 久久精品国产96久久久香蕉| 91精品人妻一区二区三区蜜桃欧美| 警花av一区二区三区| 在线观看视频一区二区欧美日韩| 久久这里只有精品23| 老司机在线视频二区| 国产情人综合久久777777| 国产伦精品一区二区| 国产剧情久久久| 青椒成人免费视频| 91精品国产亚洲| 久久久久久久久艹| 国产精品黑丝在线播放| 亚洲图片欧美午夜| 国产精品边吃奶边做爽| 国产精品毛片久久久| 日韩一区二区三区视频在线观看| 奇米影视四色在线| 色婷婷综合久久久中字幕精品久久 | 欧美v日韩v国产v| 亚洲一二三不卡| 亚洲人成网站在线在线观看| 欧美日韩亚洲综合一区| 国产又大又黄又粗又爽| 97久久网站| 欧美日韩一区成人| 亚洲精品www.| 日韩黄色碟片| 91精品国产91久久久久久最新毛片| 免费看污久久久| 黄色av一区二区三区| 国产成人精品网址| 亚洲最大成人在线| 午夜精品一二三区| 国产成人精品免费看| 亚洲v日韩v综合v精品v| 99免费在线视频| 国产精品亚洲第一| 国产精品福利视频| 日韩一区二区三区不卡| av在线一区二区| 久久99精品久久久久久久久久| 日本免费精品视频| 久久久久久久欧美精品| 日韩美女av在线免费观看| 日韩在线视频免费看| 久久免费大视频| 久久福利视频导航| 国产精品suv一区二区69| 亚洲国内自拍| 国产成人久久久精品一区| 国模私拍一区二区| 国产在线播放一区二区三区| 粉嫩av一区二区三区免费观看| 熟妇人妻中文av无码| 国产亚洲欧美日韩在线一区| 伊人精品久久久久7777| av伦理在线| 欧美性大战久久久久久久| 伊人五月天婷婷| 日本午夜精品久久久| 在线观看国产精品91| 福利所第一导航| 午夜一区二区三区不卡视频| 成人国产精品日本在线| 天天操天天插天天射| 亚洲国产精品精华液ab| 精品欧美一区二区精品久久| 国产九九在线| 亚洲一区二区三区激情| 成人观看免费完整观看| 91麻豆精品| 亚洲精品视频网上网址在线观看| 萌白酱视频在线| 亚洲精品免费观看| 国产在线精品一区免费香蕉| 无码精品人妻一区二区三区影院 | 天天躁日日躁aaaa视频| 国产精品成人av| 欧美亚洲另类制服自拍| 国产美女www爽爽爽视频| 久久综合999| 成人午夜视频免费观看| xxxxx.日韩| 日韩成人黄色av| 青青青在线免费观看| 快she精品国产999| 官网99热精品| 国产视频在线播放| 色噜噜久久综合| 国产精品久久久久久在线观看| 欧美hd在线| 日产精品99久久久久久| 亚洲黄色小说网址| 自拍偷拍国产精品| 国产精品拍拍拍| 亚洲bt欧美bt精品777| 欧美日本高清一区| 国产精品-色哟哟| 中文在线资源观看网站视频免费不卡| 欧美综合在线播放| 澳门久久精品| 欧美精品免费在线| 国产精品欧美久久久久天天影视| 日本一区二区不卡视频| 欧美一级黄色影院| 日韩成人av在线资源| 欧美黑人国产人伦爽爽爽| 国产乱人乱偷精品视频| 国产精品女同互慰在线看| 国产精品无码专区av在线播放 | 欧美成人片在线观看| 久久国产精品无码网站| 日本在线视频一区| 韩国成人动漫| 亚洲欧美日韩国产成人| 久久露脸国语精品国产91| 成人深夜福利app| 日本精品福利视频| 一区二区在线视频观看| 欧美精品中文字幕一区| 国产成人精品毛片| 亚洲精品亚洲人成人网在线播放| 手机精品视频在线| 欧美福利网址| 国产精品久久7| 182在线播放| 亚洲第一福利视频| 日韩av大片在线观看| av一区二区三区在线| 日本不卡在线观看视频| 国产精品免费大片| 国产精品久久久| 欧美成人三区| 日韩欧美国产小视频| 久草中文在线视频| av网站免费线看精品| 女人和拘做爰正片视频| 国产99久久精品一区二区300| 欧洲成人性视频| 国产在线视频网站| 欧美日韩高清影院| 青青操视频在线播放| 99热99精品| 成年人免费大片| 91亚洲自偷观看高清| 亚洲一区亚洲二区亚洲三区| 国产后进白嫩翘臀在线观看视频| 亚洲国产中文字幕久久网| 日韩欧美在线观看免费| 中文字幕在线观看一区| 佐佐木明希电影| 久久av一区| 麻豆中文字幕在线观看| 国产精品视频3p| 国产999在线| 超碰在线免费播放| 亚洲国产高清自拍| 久久精品偷拍视频| 亚洲精品欧美专区| 人人妻人人澡人人爽人人精品| 日韩 欧美一区二区三区| 超碰97在线看| 国产aⅴ精品一区二区三区久久| 国产日韩欧美自拍| 91桃色在线| 日韩在线资源网| 欧美一级片免费| 欧美日韩免费视频| 国产精品日日夜夜| 国产精品三级电影| 免费a v网站| 久99久精品视频免费观看| 日本丰满少妇xxxx| 久久在线视频| 蜜桃麻豆91| 蜜桃精品一区二区三区| 国产999在线观看| 里番在线播放| 中文字幕亚洲欧美日韩2019| 欧美一区二区三区黄片| 欧美日韩国产首页在线观看| 在线观看 中文字幕| 国产精品国产三级国产专播品爱网| 国产不卡一二三| 国产综合色精品一区二区三区| 久久久久久久久久久久久国产精品 | 主播福利视频一区| 熟妇高潮一区二区高潮| 日韩一级完整毛片| 中文字幕二区三区| 福利视频一区二区| 精品一区在线视频| 亚洲欧美一区二区三区久本道91 | 日韩免费看片| 免费av在线一区二区| 超碰cao国产精品一区二区| 成人黄色av网站| 成人国产一区| 日韩美女中文字幕| 中文字幕在线视频网站| 欧美极品美女电影一区| av文字幕在线观看| 色噜噜狠狠色综合网图区 | 三级精品视频| 国产一区二区三区色淫影院| 久久国际精品| 亚洲一区二区三区在线免费观看| 99re久久| 国产在线视频91| 国产精品久久乐| 国产欧美精品一区二区三区介绍| 日韩在线短视频| 国产精品18久久久久久首页狼| 亚洲精品一区| 日本精品性网站在线观看| 亚洲第一av| 日本久久久久久久久久久| 综合日韩av| 日韩免费在线视频| 欧美第一视频| 国产精品高清免费在线观看| 日韩欧美精品电影| 国产精品欧美激情在线播放| 欧美天堂一区| 亚洲一区亚洲二区亚洲三区| 亚洲精品国产九九九| 超碰97人人在线| 国产精品白浆| 久久国产精品-国产精品| 午夜先锋成人动漫在线| 欧美日韩精品免费观看视一区二区| 一道在线中文一区二区三区| 日本午夜精品电影| 日韩在线观看| 超薄肉色丝袜足j调教99| 黄色亚洲免费| av免费观看网| 丝瓜av网站精品一区二区| 中文字幕永久视频| 黄色小说综合网站| 国产性猛交96| 国产三级精品三级| 日本高清不卡免费| 亚洲另类色综合网站| 日韩精品在线免费看| 色老头久久综合| 亚洲图片视频小说| 日韩一区二区三区视频在线观看| 欧美 日韩 综合| 亚洲午夜未删减在线观看 | 精品国产精品| 亚洲免费av网| 亚洲精品一二| 欧美婷婷精品激情| 国产成人精品免费| xxx在线播放| 亚洲精品日产精品乱码不卡| 国产精品美女久久久久av爽| 在线观看日韩av先锋影音电影院| 国产精品无码久久av| 亚洲国产免费av| 在线免费观看的av网站| 欧美激情中文网| 国产精品久久久久久吹潮| 动漫美女被爆操久久久| 不卡一区综合视频| 国产xxxx振车| 麻豆freexxxx性91精品| 星空大象在线观看免费播放| 国产精品日韩精品欧美在线| 国产成人精品亚洲男人的天堂| 欧美午夜精品电影| 免费看日韩av| www高清在线视频日韩欧美| 多野结衣av一区| 91美女高潮出水| 欧洲专线二区三区| 99久久久精品视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久资源综合| 自拍偷拍99| 久久综合网络一区二区| 国产成人av片| 中文字幕一区二区不卡| 六月丁香婷婷综合| 精品盗摄一区二区三区| 午夜视频网站在线观看| 日韩一级高清毛片| 成人精品一区二区三区免费| 国语自产精品视频在线看| 中文字幕日本一区| 日韩精品一区二区三区色偷偷| 伊人影院久久| 成年人性生活视频| 国产精品美女久久福利网站| 国产91精品一区| 精品国产一二三区| 宅男网站在线免费观看| 91精品免费看| 日韩中文字幕高清在线观看| 国产真实乱子伦| 99re6这里只有精品视频在线观看| 国产a级片视频| 国产精品国产自产拍高清av| 亚洲av人无码激艳猛片服务器| 日韩精品中文字| 182在线播放| 精品视频在线观看| 亚洲国产精品第一区二区| 国产麻豆剧传媒精品国产| 一区二区三区在线影院| av加勒比在线| 九九热99久久久国产盗摄| 高清一区二区| 精品一区二区成人免费视频 | 亚洲无人区码一码二码三码| 亚洲免费av在线| 国产91视频在线| 欧美裸身视频免费观看| 亚洲超碰在线观看| 成年丰满熟妇午夜免费视频| 国产成人精品免费在线| 久久综合成人网| 亚洲国产精品va在线看黑人动漫| 牛牛电影国产一区二区| 国产伦精品一区二区三毛| 亚洲黑丝一区二区| www.免费av| 色狠狠一区二区| 成人动漫在线免费观看| 国产精品视频色| 色三级在线观看| 亚洲精品一级二级三级| 欧美一级在线播放| 精品一区二区无码| 精品国产乱码久久久久久图片| 日本三级韩国三级欧美三级| 成人三级视频在线观看一区二区| 亚洲网站在线| 欧美丰满少妇人妻精品| 欧美在线小视频| 老司机午夜在线视频| 成人欧美一区二区| 夜夜精品视频| 国产一区二区三区精品在线| 91麻豆精品国产91久久久久久| 欧美家庭影院| 国产不卡在线观看| 麻豆视频在线| 成人av电影免费| 美女91精品| 国产中文av在线| 精品国产露脸精彩对白| 欧美电影网址| 麻豆中文字幕在线观看| aa级大片欧美| 亚洲专区第一页| 欧美日本在线视频中文字字幕| 五月激激激综合网色播| 日本人69视频| 五月天一区二区| 永久av在线| 久久99久久99精品蜜柚传媒| 免费在线看一区| 日本a在线观看| 精品国产一区二区三区久久| 国内精品免费| 国产精品嫩草影院8vv8| 精品美女永久免费视频| 国产在线高潮| 日本电影一区二区三区| 国产成人亚洲精品狼色在线| 国产女主播喷水视频在线观看| 欧美激情成人在线视频| 成人毛片免费看|