日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

webmvcconfigurer配置跨域_为什么加了 Spring Security 会导致 Spring Boot 跨域失效呢?...

發(fā)布時(shí)間:2023/12/20 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 webmvcconfigurer配置跨域_为什么加了 Spring Security 会导致 Spring Boot 跨域失效呢?... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊上方?IT牧場(chǎng)?,選擇?置頂或者星標(biāo)

技術(shù)干貨每日送達(dá)

作者:歐陽(yáng)我去

鏈接:https://segmentfault.com/a/1190000019485883

作為一個(gè)后端開(kāi)發(fā),我們經(jīng)常遇到的一個(gè)問(wèn)題就是需要配置?CORS,好讓我們的前端能夠訪問(wèn)到我們的 API,并且不讓其他人訪問(wèn)。而在 Spring 中,我們見(jiàn)過(guò)很多種?CORS?的配置,很多資料都只是告訴我們可以這樣配置、可以那樣配置,但是這些配置有什么區(qū)別?

1、CORS 是什么

首先我們要明確,CORS?是什么,以及規(guī)范是如何要求的。這里只是梳理一下流程。

CORS?全稱是?Cross-Origin Resource Sharing,直譯過(guò)來(lái)就是跨域資源共享。要理解這個(gè)概念就需要知道域、資源和同源策略這三個(gè)概念。

  • 域,指的是一個(gè)站點(diǎn),由?protocal、host?和?port?三部分組成,其中?host?可以是域名,也可以是 ip ;port 如果沒(méi)有指明,則是使用?protocal?的默認(rèn)端口.
  • 資源,是指一個(gè)?URL?對(duì)應(yīng)的內(nèi)容,可以是一張圖片、一種字體、一段 HTML 代碼、一份 JSON 數(shù)據(jù)等等任何形式的任何內(nèi)容。
  • 同源策略,指的是為了防止?XSS,瀏覽器、客戶端應(yīng)該僅請(qǐng)求與當(dāng)前頁(yè)面來(lái)自同一個(gè)域的資源,請(qǐng)求其他域的資源需要通過(guò)驗(yàn)證。

了解了這三個(gè)概念,我們就能理解為什么有 CORS 規(guī)范了:從站點(diǎn) A 請(qǐng)求站點(diǎn) B 的資源的時(shí)候,由于瀏覽器的同源策略的影響,這樣的跨域請(qǐng)求將被禁止發(fā)送;為了讓跨域請(qǐng)求能夠正常發(fā)送,我們需要一套機(jī)制在不破壞同源策略的安全性的情況下、允許跨域請(qǐng)求正常發(fā)送,這樣的機(jī)制就是 CORS。

2、預(yù)檢請(qǐng)求

在?CORS?中,定義了一種預(yù)檢請(qǐng)求,即?preflight request,當(dāng)實(shí)際請(qǐng)求不是一個(gè)?簡(jiǎn)單請(qǐng)求?時(shí),會(huì)發(fā)起一次預(yù)檢請(qǐng)求。預(yù)檢請(qǐng)求是針對(duì)實(shí)際請(qǐng)求的 URL 發(fā)起一次 OPTIONS 請(qǐng)求,并帶上下面三個(gè) headers :

  • Origin:值為當(dāng)前頁(yè)面所在的域,用于告訴服務(wù)器當(dāng)前請(qǐng)求的域。如果沒(méi)有這個(gè) header,服務(wù)器將不會(huì)進(jìn)行 CORS 驗(yàn)證。
  • Access-Control-Request-Method:值為實(shí)際請(qǐng)求將會(huì)使用的方法。
  • Access-Control-Request-Headers:值為實(shí)際請(qǐng)求將會(huì)使用的 header 集合。

如果服務(wù)器端?CORS?驗(yàn)證失敗,則會(huì)返回客戶端錯(cuò)誤,即 4xx 的狀態(tài)碼。

否則,將會(huì)請(qǐng)求成功,返回?200?的狀態(tài)碼,并帶上下面這些 headers:

  • Access-Control-Allow-Origin:允許請(qǐng)求的域,多數(shù)情況下,就是預(yù)檢請(qǐng)求中的 Origin 的值。
  • Access-Control-Allow-Credentials:一個(gè)布爾值,表示服務(wù)器是否允許使用 cookies。
  • Access-Control-Expose-Headers:實(shí)際請(qǐng)求中可以出現(xiàn)在響應(yīng)中的 headers 集合。
  • Access-Control-Max-Age:預(yù)檢請(qǐng)求返回的規(guī)則可以被緩存的最長(zhǎng)時(shí)間,超過(guò)這個(gè)時(shí)間,需要再次發(fā)起預(yù)檢請(qǐng)求。
  • Access-Control-Allow-Methods:實(shí)際請(qǐng)求中可以使用到的方法集合瀏覽器會(huì)根據(jù)預(yù)檢請(qǐng)求的響應(yīng),來(lái)決定是否發(fā)起實(shí)際請(qǐng)求。

2.1 小結(jié)

到這里, 我們就知道了跨域請(qǐng)求會(huì)經(jīng)歷的故事:

  • 訪問(wèn)另一個(gè)域的資源。
  • 有可能會(huì)發(fā)起一次預(yù)檢請(qǐng)求(非簡(jiǎn)單請(qǐng)求,或超過(guò)了 Max-Age)。
  • 發(fā)起實(shí)際請(qǐng)求。
  • 接下來(lái),我們看看在 Spring 中,我們是如何讓 CORS 機(jī)制在我們的應(yīng)用中生效的。

    3、三種配置的方式

    Spring 提供了多種配置?CORS?的方式,有的方式針對(duì)單個(gè) API,有的方式可以針對(duì)整個(gè)應(yīng)用;有的方式在一些情況下是等效的,而在另一些情況下卻又出現(xiàn)不同。我們這里例舉幾種典型的方式來(lái)看看應(yīng)該如何配置。

    假設(shè)我們有一個(gè) API:

    @RestController
    class?HelloController?{
    ????@GetMapping("hello")
    ????fun?hello():?String?{
    ????????return?"Hello,?CORS!"
    ????}
    }

    3.1 @CrossOrigin?注解

    使用 @CorssOrigin?注解需要引入?Spring Web?的依賴,該注解可以作用于方法或者類,可以針對(duì)這個(gè)方法或類對(duì)應(yīng)的一個(gè)或多個(gè) API 配置 CORS 規(guī)則:

    @RestController
    class?HelloController?{
    ????@GetMapping("hello")
    ????@CrossOrigin(origins?=?["http://localhost:8080"])
    ????fun?hello():?String?{
    ????????return?"Hello,?CORS!"
    ????}
    }

    3.2 實(shí)現(xiàn)?WebMvcConfigurer.addCorsMappings?方法

    WebMvcConfigurer?是一個(gè)接口,它同樣來(lái)自于 Spring Web。我們可以通過(guò)實(shí)現(xiàn)它的 addCorsMappings 方法來(lái)針對(duì)全局 API 配置 CORS 規(guī)則:

    @Configuration
    @EnableWebMvc
    class?MvcConfig:?WebMvcConfigurer?{
    ????override?fun?addCorsMappings(registry:?CorsRegistry)?{
    ????????registry.addMapping("/hello")
    ????????????????.allowedOrigins("http://localhost:8080")
    ????}
    }

    3.3 注入?CorsFilter

    CorsFilter?同樣來(lái)自于?Spring Web,但是實(shí)現(xiàn)?WebMvcConfigurer.addCorsMappings?方法并不會(huì)使用到這個(gè)類,具體原因我們后面來(lái)分析。我們可以通過(guò)注入一個(gè) CorsFilter 來(lái)使用它:

    @Configuration
    class?CORSConfiguration?{
    ????@Bean
    ????fun?corsFilter():?CorsFilter?{
    ????????val?configuration?=?CorsConfiguration()
    ????????configuration.allowedOrigins?=?listOf("http://localhost:8080")
    ????????val?source?=?UrlBasedCorsConfigurationSource()
    ????????source.registerCorsConfiguration("/hello",?configuration)
    ????????return?CorsFilter(source)
    ????}
    }

    注入?CorsFilter?不止這一種方式,我們還可以通過(guò)注入一個(gè)?FilterRegistrationBean?來(lái)實(shí)現(xiàn),這里就不給例子了。

    在僅僅引入?Spring Web?的情況下,實(shí)現(xiàn)?WebMvcConfigurer.addCorsMappings?方法和注入?CorsFilter?這兩種方式可以達(dá)到同樣的效果,二選一即可。它們的區(qū)別會(huì)在引入 Spring Security 之后會(huì)展現(xiàn)出來(lái),我們后面再來(lái)分析。

    4、Spring Security 中的配置

    在引入了?Spring Security?之后,我們會(huì)發(fā)現(xiàn)前面的方法都不能正確的配置?CORS,每次?preflight request?都會(huì)得到一個(gè)?401?的狀態(tài)碼,表示請(qǐng)求沒(méi)有被授權(quán)。這時(shí),我們需要增加一點(diǎn)配置才能讓 CORS 正常工作:

    @Configuration
    class?SecurityConfig?:?WebSecurityConfigurerAdapter()?{
    ????override?fun?configure(http:?HttpSecurity?)?{
    ????????http?.cors()
    ????}
    }

    或者,干脆不實(shí)現(xiàn)?WebMvcConfigurer.addCorsMappings?方法或者注入?CorsFilter?,而是注入一個(gè)?CorsConfigurationSource?,同樣能與上面的代碼配合,正確的配置 CORS:

    @Bean
    fun?corsConfigurationSource():?CorsConfigurationSource?{
    ????val?configuration?=?CorsConfiguration()
    ????configuration.allowedOrigins?=?listOf("http://localhost:8080")
    ????val?source?=?UrlBasedCorsConfigurationSource()
    ????source.registerCorsConfiguration("/hello",?configuration)
    ????return?source
    }

    到此,我們已經(jīng)看過(guò)了幾種典型的例子了,我們接下來(lái)看看 Spring 到底是如何實(shí)現(xiàn) CORS 驗(yàn)證的。

    5、這些配置有什么區(qū)別

    我們會(huì)主要分析實(shí)現(xiàn)?WebMvcConfigurer.addCorsMappings?方法和調(diào)用?HttpSecurity.cors?方法這兩種方式是如何實(shí)現(xiàn)?CORS?的,但在進(jìn)行之前,我們要先復(fù)習(xí)一下 Filter 與 Interceptor 的概念。

    5.1 Filter 與 Interceptor

    上圖很形象的說(shuō)明了?Filter?與?Interceptor?的區(qū)別,一個(gè)作用在?DispatcherServlet?調(diào)用前,一個(gè)作用在調(diào)用后。

    但實(shí)際上,它們本身并沒(méi)有任何關(guān)系,是完全獨(dú)立的概念。

    Filter?由?Servlet?標(biāo)準(zhǔn)定義,要求?Filter?需要在?Servlet?被調(diào)用之前調(diào)用,作用顧名思義,就是用來(lái)過(guò)濾請(qǐng)求。在 Spring Web 應(yīng)用中,DispatcherServlet 就是唯一的 Servlet 實(shí)現(xiàn)。

    Interceptor?由 Spring 自己定義,由?DispatcherServlet?調(diào)用,可以定義在 Handler 調(diào)用前后的行為。這里的 Handler ,在多數(shù)情況下,就是我們的 Controller 中對(duì)應(yīng)的方法。

    對(duì)于?Filter?和?Interceptor?的復(fù)習(xí)就到這里,我們只需要知道它們會(huì)在什么時(shí)候被調(diào)用到,就能理解后面的內(nèi)容了。

    5.2 WebMvcConfigurer.addCorsMappings?方法做了什么

    我們從?WebMvcConfigurer.addCorsMappings?方法的參數(shù)開(kāi)始,先看看?CORS?配置是如何保存到 Spring 上下文中的,然后在了解一下 Spring 是如何使用的它們。

    5.2.1 注入 CORS 配置

    5.2.1.1 CorsRegistry 和 CorsRegistration

    WebMvcConfigurer.addCorsMappings?方法的參數(shù)?CorsRegistry?用于注冊(cè)?CORS?配置,它的源碼如下:

    public?class?CorsRegistry?{
    ????private?final?List?registrations?=?new?ArrayList<>();public?CorsRegistration?addMapping(String?pathPattern)?{
    ????????CorsRegistration?registration?=?new?CorsRegistration(pathPattern);this.registrations.add(registration);return?registration;
    ????}protected?Map?getCorsConfigurations()?{
    ????????Map?configs?=?new?LinkedHashMap<>(this.registrations.size());for?(CorsRegistration?registration?:?this.registrations)?{
    ????????????configs.put(registration.getPathPattern(),?registration.getCorsConfiguration());
    ????????}return?configs;
    ????}
    }

    我們發(fā)現(xiàn)這個(gè)類僅僅有兩個(gè)方法:

    • addMapping?接收一個(gè)?pathPattern,創(chuàng)建一個(gè)?CorsRegistration?實(shí)例,保存到列表后將其返回。在我們的代碼中,這里的 pathPattern 就是?/hello。
    • getCorsConfigurations 方法將保存的 CORS 規(guī)則轉(zhuǎn)換成 Map 后返回。

    CorsRegistration?這個(gè)類,同樣很簡(jiǎn)單,我們看看它的部分源碼:

    public?class?CorsRegistration?{
    ????private?final?String?pathPattern;
    ????private?final?CorsConfiguration?config;


    ????public?CorsRegistration(String?pathPattern)?{
    ????????this.pathPattern?=?pathPattern;
    ????????this.config?=?new?CorsConfiguration().applyPermitDefaultValues();
    ????}

    ????public?CorsRegistration?allowedOrigins(String...?origins)?{
    ????????this.config.setAllowedOrigins(Arrays.asList(origins));
    ????????return?this;
    ????}
    }

    不難發(fā)現(xiàn),這個(gè)類僅僅保存了一個(gè)?pathPattern?字符串和?CorsConfiguration,很好理解,它保存的是一個(gè) pathPattern 對(duì)應(yīng)的 CORS 規(guī)則。

    在它的構(gòu)造函數(shù)中,調(diào)用的 CorsConfiguration.applyPermitDefaultValues 方法則用于配置默認(rèn)的 CORS 規(guī)則:

    • allowedOrigins 默認(rèn)為所有域。
    • allowedMethods 默認(rèn)為 GET 、HEAD 和 POST。
    • allowedHeaders 默認(rèn)為所有。
    • maxAge 默認(rèn)為 30 分鐘。
    • exposedHeaders 默認(rèn)為 null,也就是不暴露任何 header。
    • credentials 默認(rèn)為 null。

    創(chuàng)建?CorsRegistration?后,我們可以通過(guò)它的?allowedOrigins、allowedMethods?等方法修改它的?CorsConfiguration,覆蓋掉上面的默認(rèn)值。

    現(xiàn)在,我們已經(jīng)通過(guò)?WebMvcConfigurer.addCorsMappings?方法配置好?CorsRegistry?了,接下來(lái)看看這些配置會(huì)在什么地方被注入到 Spring 上下文中。

    5.2.1.2 WebMvcConfigurationSupport

    CorsRegistry.getCorsConfigurations?方法,會(huì)被?WebMvcConfigurationSupport.getConfigurations?方法調(diào)用,這個(gè)方法如下:

    protected?final?Map?getCorsConfigurations()?{
    ????if?(this.corsConfigurations?==?null)?{
    ????????CorsRegistry?registry?=?new?CorsRegistry();
    ????????addCorsMappings(registry);
    ????????this.corsConfigurations?=?registry.getCorsConfigurations();
    ????}
    ????return?this.corsConfigurations;
    }

    addCorsMappings(registry)?調(diào)用的是自己的方法,由子類?DelegatingWebMvcConfiguration?通過(guò)委托的方式調(diào)用到?WebMvcConfigurer.addCorsMappings?方法,我們的配置也由此被讀取到。

    getCorsConfigurations?是一個(gè)?protected?方法,是為了在擴(kuò)展該類時(shí),仍然能夠直接獲取到 CORS 配置。而這個(gè)方法在這個(gè)類里被四個(gè)地方調(diào)用到,這四個(gè)調(diào)用的地方,都是為了注冊(cè)一個(gè) HandlerMapping 到 Spring 容器中。每一個(gè)地方都會(huì)調(diào)用 mapping.setCorsConfigurations 方法來(lái)接收 CORS 配置,而這個(gè)?setCorsConfigurations?方法,則由?AbstractHandlerMapping?提供,CorsConfigurations 也被保存在這個(gè)抽象類中。

    到此,我們的?CORS?配置借由?AbstractHandlerMapping?被注入到了多個(gè)?HandlerMapping?中,而這些?HandlerMapping?以 Spring 組件的形式被注冊(cè)到了 Spring 容器中,當(dāng)請(qǐng)求來(lái)臨時(shí),將會(huì)被調(diào)用。

    5.2.2 獲取 CORS 配置

    還記得前面關(guān)于 Filter 和 Interceptor 那張圖嗎?當(dāng)請(qǐng)求來(lái)到 Spring Web 時(shí),一定會(huì)到達(dá) DispatcherServlet 這個(gè)唯一的 Servlet。

    在?DispatcherServlet.doDispatch?方法中,會(huì)調(diào)用所有 HandlerMapping.getHandler 方法。好巧不巧,這個(gè)方法又是由 AbstractHandlerMapping 實(shí)現(xiàn)的:

    @Override
    @Nullable
    public?final?HandlerExecutionChain?getHandler(HttpServletRequest?request)?throws?Exception?{
    ????//?省略代碼
    ????if?(CorsUtils.isCorsRequest(request))?{
    ????????CorsConfiguration?globalConfig?=?this.corsConfigurationSource.getCorsConfiguration(request);
    ????????CorsConfiguration?handlerConfig?=?getCorsConfiguration(handler,?request);
    ????????CorsConfiguration?config?=?(globalConfig?!=?null???globalConfig.combine(handlerConfig)?:?handlerConfig);
    ????????executionChain?=?getCorsHandlerExecutionChain(request,?executionChain,?config);
    ????}
    ????return?executionChain;
    }

    在這個(gè)方法中,關(guān)于 CORS 的部分都在這個(gè) if 中。我們來(lái)看看最后這個(gè) getCorsHandlerExecutionChain 做了什么:

    protected?HandlerExecutionChain?getCorsHandlerExecutionChain(HttpServletRequest?request,
    ????????HandlerExecutionChain?chain,?@Nullable?CorsConfiguration?config)?{
    ????if?(CorsUtils.isPreFlightRequest(request))?{
    ????????HandlerInterceptor[]?interceptors?=?chain.getInterceptors();
    ????????chain?=?new?HandlerExecutionChain(new?PreFlightHandler(config),?interceptors);
    ????}
    ????else?{
    ????????chain.addInterceptor(new?CorsInterceptor(config));
    ????}
    ????return?chain;
    }

    可以看到:

    • 針對(duì)?preflight request,由于不會(huì)有對(duì)應(yīng)的?Handler?來(lái)處理,所以這里就創(chuàng)建了一個(gè) PreFlightHandler 來(lái)作為這次請(qǐng)求的 handler。
    • 對(duì)于其他的跨域請(qǐng)求,因?yàn)闀?huì)有對(duì)應(yīng)的?handler,所以就在?handlerExecutionChain?中加入一個(gè)?CorsInterceptor?來(lái)進(jìn)行?CORS?驗(yàn)證

    這里的?PreFlightHandler?和?CorsInterceptor?都是?AbstractHandlerMapping?的內(nèi)部類,實(shí)現(xiàn)幾乎一致,區(qū)別僅僅在于一個(gè)是?HttpRequestHandler,一個(gè)是 HandlerInterceptor;它們對(duì) CORS 規(guī)則的驗(yàn)證都交由 CorsProcessor 接口完成,這里采用了默認(rèn)實(shí)現(xiàn) DefaultCorsProcessor。

    DefaultCorsProcessor?則是依照?CORS?標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn),并在驗(yàn)證失敗的時(shí)候打印 debug 日志并拒絕請(qǐng)求。我們只需要關(guān)注一下標(biāo)準(zhǔn)中沒(méi)有定義的驗(yàn)證失敗時(shí)的狀態(tài)碼:

    protected?void?rejectRequest(ServerHttpResponse?response)?throws?IOException?{
    ????response.setStatusCode(HttpStatus.FORBIDDEN);
    ????response.getBody().write("Invalid?CORS?request".getBytes(StandardCharsets.UTF_8));
    }

    CORS?驗(yàn)證失敗時(shí)調(diào)用這個(gè)方法,并設(shè)置狀態(tài)碼為 403。

    5.2.3 小結(jié)

    通過(guò)對(duì)源碼的研究,我們發(fā)現(xiàn)實(shí)現(xiàn)?WebMvcConfigurer.addCorsMappings?方法的方式配置?CORS,會(huì)在 Interceptor 或者 Handler 層進(jìn)行 CORS 驗(yàn)證。

    5.3 HtttpSecurity.cors?方法做了什么

    在研究這個(gè)方法的行為之前,我們先來(lái)回想一下,我們調(diào)用這個(gè)方法解決的是什么問(wèn)題。

    前面我們通過(guò)某種方式配置好?CORS?后,引入?Spring Security,CORS?就失效了,直到調(diào)用這個(gè)方法后,CORS 規(guī)則才重新生效。

    下面這些原因,導(dǎo)致了?preflight request?無(wú)法通過(guò)身份驗(yàn)證,從而導(dǎo)致 CORS 失效:

  • preflight request 不會(huì)攜帶認(rèn)證信息。
  • Spring Security 通過(guò) Filter 來(lái)進(jìn)行身份驗(yàn)證。
  • Interceptor 和 HttpRequestHanlder 在 DispatcherServlet 之后被調(diào)用。
  • Spring Security 中的 Filter 優(yōu)先級(jí)比我們注入的 CorsFilter 優(yōu)先級(jí)高。
  • 接下來(lái)我們就來(lái)看看 HttpSecurity.cors 方法是如何解決這個(gè)問(wèn)題的。

    5.3.1 CorsConfigurer 如何配置 CORS 規(guī)則

    HttpSecurity.cors 方法中其實(shí)只有一行代碼:

    public?CorsConfigurer?cors()?throws?Exception?{
    ????return?getOrApply(new?CorsConfigurer<>());
    }

    這里調(diào)用的?getOrApply?方法會(huì)將?SecurityConfigurerAdapter?的子類實(shí)例加入到它的父類?AbstractConfiguredSecurityBuilder?維護(hù)的一個(gè)?Map?中,然后一個(gè)個(gè)的調(diào)用 configure 方法。所以,我們來(lái)關(guān)注一下 CorsConfigurer.configure 方法就好了。

    @Override
    public?void?configure(H?http)?throws?Exception?{
    ????ApplicationContext?context?=?http.getSharedObject(ApplicationContext.class);

    ????CorsFilter?corsFilter?=?getCorsFilter(context);
    ????if?(corsFilter?==?null)?{
    ????????throw?new?IllegalStateException(
    ????????????????"Please?configure?either?a?"?+?CORS_FILTER_BEAN_NAME?+?"?bean?or?a?"
    ????????????????????????+?CORS_CONFIGURATION_SOURCE_BEAN_NAME?+?"bean.");
    ????}
    ????http.addFilter(corsFilter);
    }

    這段代碼很好理解,就是在當(dāng)前的 Spring Context 中找到一個(gè)?CorsFilter,然后將它加入到 http 對(duì)象的 filters 中。由上面的 HttpSecurity.cors 方法可知,這里的 http 對(duì)象實(shí)際類型就是 HttpSecurity。

    5.3.2 getCorsFilter 方法做了什么

    也許你會(huì)好奇,HttpSecurity 要如何保證 CorsFilter 一定在 Spring Security 的 Filters 之前調(diào)用。但是在研究這個(gè)之前,我們先來(lái)看看同樣重要的?getCorsFilter?方法,這里可以解答我們前面的一些疑問(wèn)。

    private?CorsFilter?getCorsFilter(ApplicationContext?context)?{
    ????if?(this.configurationSource?!=?null)?{
    ????????return?new?CorsFilter(this.configurationSource);
    ????}

    ????boolean?containsCorsFilter?=?context
    ????????????.containsBeanDefinition(CORS_FILTER_BEAN_NAME);
    ????if?(containsCorsFilter)?{
    ????????return?context.getBean(CORS_FILTER_BEAN_NAME,?CorsFilter.class);
    ????}

    ????boolean?containsCorsSource?=?context
    ????????????.containsBean(CORS_CONFIGURATION_SOURCE_BEAN_NAME);
    ????if?(containsCorsSource)?{
    ????????CorsConfigurationSource?configurationSource?=?context.getBean(
    ????????????????CORS_CONFIGURATION_SOURCE_BEAN_NAME,?CorsConfigurationSource.class);
    ????????return?new?CorsFilter(configurationSource);
    ????}

    ????boolean?mvcPresent?=?ClassUtils.isPresent(HANDLER_MAPPING_INTROSPECTOR,
    ????????????context.getClassLoader());
    ????if?(mvcPresent)?{
    ????????return?MvcCorsFilter.getMvcCorsFilter(context);
    ????}
    ????return?null;
    }

    這是?CorsConfigurer?尋找?CorsFilter?的全部邏輯,我們用人話來(lái)說(shuō)就是:

  • CorsConfigurer?自己是否有配置?CorsConfigurationSource,如果有的話,就用它創(chuàng)建一個(gè) CorsFilter。
  • 在當(dāng)前的上下文中,是否存在一個(gè)名為?corsFilter?的實(shí)例,如果有的話,就把他當(dāng)作一個(gè) CorsFilter 來(lái)用。
  • 在當(dāng)前的上下文中,是否存在一個(gè)名為?corsConfigurationSource?的?CorsConfigurationSource?實(shí)例,如果有的話,就用它創(chuàng)建一個(gè) CorsFilter。
  • 在當(dāng)前上下文的類加載器中,是否存在類?HandlerMappingIntrospector,如果有的話,則通過(guò) MvcCorsFilter 這個(gè)內(nèi)部類創(chuàng)建一個(gè) CorsFilter。
  • 如果沒(méi)有找到,那就返回一個(gè)?null,調(diào)用的地方最后會(huì)拋出異常,阻止 Spring 初始化。
  • 上面的第 2、3、4 步能解答我們前面的配置為什么生效,以及它們的區(qū)別。

    注冊(cè)?CorsFilter?的方式,這個(gè) Filter 最終會(huì)被直接注冊(cè)到 Servlet container 中被使用到。

    注冊(cè)?CorsConfigurationSource?的方式,會(huì)用這個(gè) source 創(chuàng)建一個(gè) CorsFiltet 然后注冊(cè)到 Servlet container 中被使用到。

    而第四步的情況比較復(fù)雜。HandlerMappingIntrospector 是 Spring Web 提供的一個(gè)類,實(shí)現(xiàn)了?CorsConfigurationSource?接口,所以在?MvcCorsFilter?中,它被直接用于創(chuàng)建 CorsFilter。它實(shí)現(xiàn)的 getCorsConfiguration 方法,會(huì)經(jīng)歷:

  • 遍歷 HandlerMapping。
  • 調(diào)用 getHandler 方法得到 HandlerExecutionChain。
  • 從中找到 CorsConfigurationSource 的實(shí)例。
  • 調(diào)用這個(gè)實(shí)例的?getCorsConfiguration?方法,返回得到的 CorsConfiguration。
  • 所以得到的?CorsConfigurationSource?實(shí)例,實(shí)際上就是前面講到的 CorsInterceptor 或者 PreFlightHandler。

    所以第四步實(shí)際上匹配的是實(shí)現(xiàn) WebMvcConfigurer.addCorsMappings 方法的方式。

    由于在?CorsFilter?中每次處理請(qǐng)求時(shí)都會(huì)調(diào)用?CorsConfigurationSource.getCorsConfiguration?方法,而?DispatcherServlet?中也會(huì)每次調(diào)用?HandlerMapping.getHandler?方法,再加上這時(shí)的?HandlerExecutionChain?中還有?CorsInterceptor,所以使用這個(gè)方式相對(duì)于其他方式,做了很多重復(fù)的工作。所以 WebMvcConfigurer.addCorsMappings + HttpSecurity.cors 的方式降低了我們代碼的效率,也許微乎其微,但能避免的情況下,還是不要使用。

    5.3.3 HttpSecurity 中的 filters 屬性

    在?CorsConfigurer.configure?方法中調(diào)用的?HttpSecurity.addFilter?方法,由它的父類?HttpSecurityBuilder?聲明,并約定了很多 Filter 的順序。然而 CorsFilter 并不在其中。不過(guò)在 Spring Security 中,目前還只有?HttpSecurity?這一個(gè)實(shí)現(xiàn),所以我們來(lái)看看這里的代碼實(shí)現(xiàn)就知道 CorsFilter 會(huì)排在什么地方了。

    public?HttpSecurity?addFilter(Filter?filter)?{
    ????Class?extends?Filter>?filterClass?=?filter.getClass();
    ????if?(!comparator.isRegistered(filterClass))?{
    ????????throw?new?IllegalArgumentException("...");
    ????}
    ????this.filters.add(filter);
    ????return?this;
    }

    我們可以看到,Filter?會(huì)被直接加到?List?中,而不是按照一定的順序來(lái)加入的。但同時(shí),我們也發(fā)現(xiàn)了一個(gè)?comparator?對(duì)象,并且只有被注冊(cè)到了該類的 Filter 才能被加入到 filters 屬性中。這個(gè) comparator 又是用來(lái)做什么的呢?

    在 Spring Security 創(chuàng)建過(guò)程中,會(huì)調(diào)用到?HttpSeciryt.performBuild?方法,在這里我們可以看到 filters 和 comparator 是如何被使用到的。

    protected?DefaultSecurityFilterChain?performBuild()?throws?Exception?{
    ????Collections.sort(filters,?comparator);
    ????return?new?DefaultSecurityFilterChain(requestMatcher,?filters);
    }

    可以看到,Spring Security 使用了這個(gè)?comparator?在獲取?SecurityFilterChain?的時(shí)候來(lái)保證?filters?的順序,所以,研究這個(gè) comparator 就能知道在 SecurityFilterChain 中的那些 Filter 的順序是如何的了。

    這個(gè)?comparator?的類型是?FilterComparator?,從名字就能看出來(lái)是專用于?Filter?比較的類,它的實(shí)現(xiàn)也并不神秘,從構(gòu)造函數(shù)就能猜到是如何實(shí)現(xiàn)的:

    FilterComparator()?{
    ????Step?order?=?new?Step(INITIAL_ORDER,?ORDER_STEP);
    ????put(ChannelProcessingFilter.class,?order.next());
    ????put(ConcurrentSessionFilter.class,?order.next());
    ????put(WebAsyncManagerIntegrationFilter.class,?order.next());
    ????put(SecurityContextPersistenceFilter.class,?order.next());
    ????put(HeaderWriterFilter.class,?order.next());
    ????put(CorsFilter.class,?order.next());
    ??//?省略代碼
    }

    可以看到?CorsFilter?排在了第六位,在所有的 Security Filter 之前,由此便解決了 preflight request 沒(méi)有攜帶認(rèn)證信息的問(wèn)題。

    5.3.4 小結(jié)

    引入?Spring Security?之后,我們的?CORS?驗(yàn)證實(shí)際上是依然運(yùn)行著的,只是因?yàn)?preflight request?不會(huì)攜帶認(rèn)證信息,所以無(wú)法通過(guò)身份驗(yàn)證。使用 HttpSecurity.cors 方法會(huì)幫助我們?cè)诋?dāng)前的 Spring Context 中找到或創(chuàng)建一個(gè) CorsFilter 并安排在身份驗(yàn)證的 Filter 之前,以保證能對(duì) preflight request 正確處理。

    6、總結(jié)

    研究了 Spring 中 CORS 的代碼,我們了解到了這樣一些知識(shí):

    • 實(shí)現(xiàn)?WebMvcConfigurer.addCorsMappings?方法來(lái)進(jìn)行的?CORS?配置,最后會(huì)在 Spring 的 Interceptor 或 Handler 中生效。
    • 注入 CorsFilter 的方式會(huì)讓 CORS 驗(yàn)證在 Filter 中生效。
    • 引入?Spring Security?后,需要調(diào)用 HttpSecurity.cors 方法以保證 CorsFilter 會(huì)在身份驗(yàn)證相關(guān)的 Filter 之前執(zhí)行。
    • HttpSecurity.cors?+?WebMvcConfigurer.addCorsMappings?是一種相對(duì)低效的方式,會(huì)導(dǎo)致跨域請(qǐng)求分別在 Filter 和 Interceptor 層各經(jīng)歷一次 CORS 驗(yàn)證。
    • HttpSecurity.cors + 注冊(cè) CorsFilter 與 HttpSecurity.cors + 注冊(cè) CorsConfigurationSource 在運(yùn)行的時(shí)候是等效的。
    • 在 Spring 中,沒(méi)有通過(guò) CORS 驗(yàn)證的請(qǐng)求會(huì)得到狀態(tài)碼為 403 的響應(yīng)。

    干貨分享

    最近將個(gè)人學(xué)習(xí)筆記整理成冊(cè),使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無(wú)套路領(lǐng)取!

    ?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開(kāi)源書》?005:《Kubernetes開(kāi)源書》?006:《DDD速成(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)速成)》?007:全部?008:加技術(shù)群討論

    近期熱文

    ?LinkedBlockingQueue vs ConcurrentLinkedQueue?解讀Java 8 中為并發(fā)而生的 ConcurrentHashMap?Redis性能監(jiān)控指標(biāo)匯總?最全的DevOps工具集合,再也不怕選型了!?微服務(wù)架構(gòu)下,解決數(shù)據(jù)庫(kù)跨庫(kù)查詢的一些思路?聊聊大廠面試官必問(wèn)的 MySQL 鎖機(jī)制

    關(guān)注我

    喜歡就點(diǎn)個(gè)"在看"唄^_^

    總結(jié)

    以上是生活随笔為你收集整理的webmvcconfigurer配置跨域_为什么加了 Spring Security 会导致 Spring Boot 跨域失效呢?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产视频美女 | 黄色毛片视频免费观看中文 | 91中文字幕永久在线 | 四虎永久网站 | 国产在线观看中文字幕 | 日韩欧美视频免费观看 | 九九热免费在线观看 | 激情片av| 91成熟丰满女人少妇 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 色老板在线| 久久伦理电影 | 九九热在线观看 | 久久久精品午夜 | 国产精彩视频一区二区 | 在线观看中文 | 久久九九精品 | 天天摸天天弄 | 国产视频 亚洲视频 | 国产色就色 | 欧美三人交 | 亚洲天天综合 | 在线观看成年人 | 欧美一级片在线播放 | 成人av在线亚洲 | 免费看成人a | 狠狠色综合网站久久久久久久 | 狠狠色丁香婷婷综合最新地址 | 日韩精品影视 | 97人人澡人人添人人爽超碰 | 亚洲精品视频在线观看免费视频 | 久久久国产一区二区三区 | 激情av网| 国产拍在线 | 亚洲视屏在线播放 | 久艹在线免费观看 | 欧洲性视频 | 亚洲激情久久 | 在线观看av国产 | 337p日本大胆噜噜噜噜 | 久操久 | 日本中文在线播放 | 夜夜夜夜操| 久久久免费在线观看 | 欧美影片 | 成人免费在线观看电影 | 久久www免费视频 | 亚洲艳情| 亚洲国产成人精品在线观看 | aaa亚洲精品一二三区 | 美女视频是黄的免费观看 | 国产91精品一区二区麻豆网站 | 亚洲乱亚洲乱亚洲 | 精品少妇一区二区三区在线 | 国产黄色资源 | 香蕉影院在线 | 久久av观看 | 久久伊人热 | 国产精品久久久久久久免费 | 手机av看片 | 在线中文字幕视频 | 91免费网址 | 亚洲人成精品久久久久 | 91福利国产在线观看 | av在线网站免费观看 | 久久久久国产视频 | 国产在线中文字幕 | 97超级碰碰碰视频在线观看 | 免费h漫在线观看 | 99久久99久久精品国产片 | 黄色片亚洲 | 成人一区影院 | 婷婷伊人综合 | 不卡av在线免费观看 | 丁香花五月 | 啪嗒啪嗒免费观看完整版 | 日日添夜夜添 | 狠狠色丁香久久婷婷综合丁香 | 精品 一区 在线 | 久久精品久久精品久久39 | 狠狠艹夜夜干 | 国产高清在线 | 一二三区高清 | 99久久久国产精品免费观看 | 亚洲一区二区视频 | 丁香导航 | 国产日韩欧美视频在线观看 | 久久久久久免费网 | 视频在线播放国产 | 毛片视频网址 | 国产精品一区二区三区在线看 | 国产 视频 高清 免费 | 久久久免费 | 午夜视频一区二区三区 | 免费三级黄色 | 天堂av免费看 | 丁香婷婷综合激情五月色 | 国产美女久久 | 午夜少妇av | 成人中心免费视频 | 天天操比 | 欧美调教网站 | 亚洲精品自拍视频在线观看 | 欧美有色 | 手机看片1042 | 超碰免费公开 | 精品久久久久国产免费第一页 | 国产 日韩 在线 亚洲 字幕 中文 | 免费福利在线播放 | 亚洲高清视频在线 | 日韩免费在线 | 91麻豆文化传媒在线观看 | 亚洲精品视频在线观看免费视频 | 狠狠操狠狠干天天操 | 超碰公开97 | 国产97视频| 五月婷婷精品 | 9在线观看免费高清完整版 玖玖爱免费视频 | 欧美亚洲一级片 | 天天干一干 | 欧美精品久久久久久久免费 | 国产中文字幕大全 | 黄色影院在线观看 | av在线播放一区二区三区 | 国产亚洲精品精品精品 | 91伊人久久大香线蕉蜜芽人口 | 久久精品视频播放 | 91精品老司机久久一区啪 | 2022中文字幕在线观看 | 成人av资源网 | 色综合久久久久久中文网 | 天天久久夜夜 | 亚洲另类视频在线观看 | www.91成人 | 91亚洲精 | 国产一区二区在线观看视频 | 亚洲午夜久久久久 | 国产日韩av在线 | 久久资源总站 | 精精国产xxxx视频在线播放 | 亚洲高清在线 | 久久久国产精品电影 | 久久久精品免费观看 | 日本在线观看一区二区三区 | 亚洲成人第一区 | 99久热在线精品视频观看 | 福利视频导航网址 | 97av视频在线 | 欧美日韩精品久久久 | 婷婷激情五月综合 | 国产综合精品久久 | www免费看片com | 尤物97国产精品久久精品国产 | 97色在线观看免费视频 | 日本精品久久久久影院 | 亚洲天天做 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产香蕉视频在线观看 | 波多野结衣视频一区二区三区 | 日本精品久久久久影院 | 久久综合久久八八 | 久久蜜臀一区二区三区av | 免费国产黄线在线观看视频 | 国产精品乱码一区二区视频 | 欧美日韩三级在线观看 | 国产裸体永久免费视频网站 | 免费视频久久久久 | 日韩影片在线观看 | 国产精品区一区 | 亚洲精品视频在线免费播放 | 久久久在线免费观看 | 欧美日韩一区二区视频在线观看 | 国产综合精品一区二区三区 | 99在线观看视频网站 | 久久激情婷婷 | 国产精品久久久久av | 久久人视频 | 麻豆一二三精选视频 | 亚洲综合成人专区片 | 在线激情av电影 | 91超级碰| 天天综合网 天天综合色 | 国产精品不卡一区 | 97成人在线观看视频 | 成人av免费在线 | 久久精品国产v日韩v亚洲 | 欧美激情综合五月色丁香 | 国产成人精品亚洲日本在线观看 | 欧美在线观看禁18 | 国产成在线观看免费视频 | 日韩欧美精品在线视频 | 91精品国产成人www | 成人午夜剧场在线观看 | a黄色一级片 | 欧美另类一二三四区 | 久久成人资源 | 久久看毛片 | 国产黄免费 | 在线观看你懂的网站 | 一级免费观看 | 久久婷亚洲五月一区天天躁 | 天天综合网天天 | 国产成人久 | 91成人免费电影 | 久久99偷拍视频 | 久久av中文字幕片 | 亚洲高清网站 | av色影院| 波多野结衣日韩 | 欧美亚洲免费在线一区 | 99精品免费观看 | 天天操天天能 | 国产91在线 | 美洲 | 国产伦理一区 | 国产一区在线视频播放 | 狠色狠色综合久久 | 天天干天天操天天入 | 深爱激情五月综合 | 中文字幕观看在线 | 日韩精品一区在线播放 | 久久久99精品免费观看乱色 | 婷婷色中文字幕 | 黄色aaa级片 | 国产成人精品一区在线 | 国产精品va最新国产精品视频 | 日韩电影在线视频 | 日韩激情免费视频 | 99久久9| 国产艹b视频 | 91在线porny国产在线看 | 亚洲精品一区二区三区在线观看 | 亚洲乱码精品久久久久 | 国产不卡免费视频 | av电影在线观看完整版一区二区 | 丰满少妇久久久 | 精品久久免费 | 亚洲精品国产精品乱码在线观看 | 亚洲激情在线播放 | 国产精品精品 | 国产视频在线一区二区 | 亚洲电影图片小说 | 在线免费观看视频一区二区三区 | 精品国产乱码一区二区三区在线 | 人人爽人人爽av | 午夜精品电影一区二区在线 | 欧美va天堂va视频va在线 | 国产精品网红直播 | 亚洲精品久久久久www | 国产一级精品绿帽视频 | 国产精品久久久久久模特 | 香蕉视频91 | 激情综合狠狠 | 中文字幕成人在线观看 | 青青河边草免费观看完整版高清 | 欧美日韩亚洲一 | 一级片视频在线 | 成年在线观看 | 精品一区91 | 亚洲国产av精品毛片鲁大师 | 亚州精品一二三区 | 最新日韩在线观看视频 | 欧美va天堂va视频va在线 | 黄av免费在线观看 | 国产精品美女久久 | 欧美精品做受xxx性少妇 | 国产专区一 | 91在线麻豆 | 中文字幕久久亚洲 | 欧美激情在线网站 | 亚洲码国产日韩欧美高潮在线播放 | 手机av观看 | 国产人成在线观看 | 久久久亚洲成人 | 亚洲女人av| 日韩午夜在线播放 | 欧美一区二区精品在线 | 国产成人免费在线 | 日韩欧美一区二区三区免费观看 | 国产精品va在线 | 久草观看 | 日韩有码在线播放 | 国产超碰97 | 99热999 | 日本精品久久久久影院 | 日狠狠 | 国产美女视频网站 | 亚洲精品男女 | 久久综合九色 | 国产三级精品三级在线观看 | 久久久综合 | 欧美一二三区在线播放 | 欧美 日韩 视频 | 丁香六月久久综合狠狠色 | 国产一区二区不卡视频 | 久久婷婷影视 | 亚洲精品tv久久久久久久久久 | 久久午夜色播影院免费高清 | 久久你懂得| 成人免费中文字幕 | 色爱区综合激月婷婷 | 91网免费看 | 91精品999| 国产精品久久综合 | 成年人电影免费在线观看 | 天天爱天天 | 成全在线视频免费观看 | 人人爱人人添 | 国产中文在线视频 | 国产精品成人一区二区 | 99久久一区 | 亚洲电影免费 | 欧美做受xxx | 亚洲国产一区二区精品专区 | 99精品在这里 | 免费a网 | 中文字幕黄色av | 久久国产高清 | 国产精品国产亚洲精品看不卡15 | 国产午夜在线 | 96亚洲精品久久久蜜桃 | 国精产品永久999 | а天堂中文最新一区二区三区 | 久久久午夜剧场 | 久久视影 | 三级大片网站 | 热久久精品在线 | 免费91在线 | 欧美va天堂va视频va在线 | 久久爱资源网 | 中文字幕免费观看全部电影 | 久草免费新视频 | 亚洲精品在线观看网站 | 日本午夜在线观看 | 中文亚洲欧美日韩 | 国产青草视频在线观看 | 五月婷婷久久综合 | 黄色国产在线 | 免费观看一级一片 | 日韩在线观看中文字幕 | 欧美另类巨大 | 国产精品久久久久久久久久尿 | 久在线观看视频 | 91久久丝袜国产露脸动漫 | 毛片一级免费一级 | 一区二区三区中文字幕在线观看 | 九九免费精品视频在线观看 | 久久国产精品99久久久久久进口 | 国产黄色av | 国产99久| 日本最新一区二区三区 | 久久免费电影 | 精品一区二区综合 | 国产精品入口a级 | 免费在线观看成年人视频 | 日本中文字幕影院 | 天天干夜夜夜操天 | 久久久精品欧美一区二区免费 | 天天爽天天做 | 精品中文字幕在线观看 | 三级黄色在线观看 | 国产手机在线 | 91亚洲精品乱码久久久久久蜜桃 | 日韩成人在线一区二区 | 麻豆成人精品视频 | 亚洲成人精品在线 | 婷婷去俺也去六月色 | 午夜久久美女 | 精品国产a| 人人射人人 | www.天天干.com| 国产一级做a | 午夜 在线 | 亚洲春色奇米影视 | 国产在线精品二区 | 中文字幕在线看视频 | 精品影院一区二区久久久 | 天天艹天天干天天 | 久久综合中文色婷婷 | 国内精品久久久久影院男同志 | 亚洲美女久久 | 久久久久久久久久久久电影 | 99热 精品在线 | 亚洲日本成人 | 色综合激情久久 | 国产视频网站在线观看 | 国产最新在线视频 | 婷婷色站| 六月色婷婷 | 日日操日日插 | 免费观看黄色av | 久久人人97超碰com | 精品国产欧美一区二区 | 中文一二区 | 天天色天天操天天爽 | 午夜精品久久久久久久99无限制 | 中文字幕韩在线第一页 | 国产成人综合在线观看 | 中文字幕国产在线 | 国产亚洲精品久久久久久久久久久久 | 中文字幕在线专区 | 久久精品一| 欧美另类亚洲 | 精品免费视频123区 午夜久久成人 | 国产热re99久久6国产精品 | 九九在线视频 | 日本精品久久久久中文字幕5 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产无套视频 | 99热在线免费观看 | 天天躁日日躁狠狠躁av中文 | 中文字幕视频免费观看 | 色综合天天狠天天透天天伊人 | 中文字幕亚洲精品在线观看 | 夜又临在线观看 | 91手机视频在线 | 久久久久女教师免费一区 | 97视频在线观看免费 | 免费在线国产视频 | 国产成人精品一区二区在线观看 | 久99久中文字幕在线 | 69视频在线 | 国产 日韩 在线 亚洲 字幕 中文 | 午夜美女福利 | 日日日日干 | 国产又粗又猛又黄又爽的视频 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲妇女av | 波多野结衣电影一区 | 久久久精品 一区二区三区 国产99视频在线观看 | 一本大道久久精品懂色aⅴ 五月婷社区 | 国产日产高清dvd碟片 | 欧美在线视频免费 | 日日射天天射 | avsex| 色婷婷激情综合 | 香蕉视频国产在线观看 | av蜜桃在线 | 亚洲国产精品久久 | www免费网站在线观看 | av高清不卡 | 激情欧美丁香 | 欧美爽爽爽| 久久草在线精品 | 亚洲精品国产日韩 | 四虎成人精品在永久免费 | 中文字幕欧美日韩va免费视频 | 高清av网站 | 好看av在线| 欧美精品中文字幕亚洲专区 | 国产精品高潮呻吟久久久久 | 六月丁香久久 | 国产日产精品一区二区三区四区 | 一区二区三区四区五区在线 | 国产成人免费av电影 | 97免费中文视频在线观看 | 激情综合婷婷 | 二区三区毛片 | 亚洲专区欧美 | 亚洲精品在线观看av | 国产精品一区二区你懂的 | 欧美日韩一区二区在线观看 | 亚洲91视频 | 五月天婷婷视频 | 欧美国产高清 | 久久精品国产一区二区三 | 亚洲资源视频 | 国产成人精品免费在线观看 | 亚洲在线| 黄色小说免费观看 | 五月婷婷中文 | 日韩在线三区 | 成人av电影在线观看 | 国产日韩欧美自拍 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 超碰在线观看99 | 日韩欧美精品在线观看 | av在线网站大全 | 国产在线探花 | 婷婷狠狠操 | 免费精品久久久 | 欧美午夜一区二区福利视频 | 97在线播放 | 午夜国产一区 | 国产精品久久久久久久午夜片 | 婷婷精品视频 | 91 在线视频播放 | 精品中文字幕在线播放 | 国产免费又爽又刺激在线观看 | 久久99视频免费观看 | 久久久久97国产 | 色资源中文字幕 | 99精品视频一区二区 | 日韩精品一区二区三区高清免费 | 欧美一级片在线播放 | 欧美怡红院视频 | 一区二区不卡在线观看 | 国产人成一区二区三区影院 | 亚洲精品一区二区三区在线观看 | 在线视频观看91 | japanesefreesex中国少妇 | 久久福利综合 | 麻豆影视网站 | 日韩在线观看的 | 亚洲成人影音 | 在线视频 区 | 中文字幕有码在线 | 高清免费av在线 | 999久久久免费精品国产 | 五月天国产 | 免费97视频 | 国产色婷婷| 99精品久久久久久久久久综合 | 亚洲成人精品影院 | 免费网站污 | 精品a级片 | 色中色综合| 99久热| 国产精品视频专区 | 狠狠操狠狠干天天操 | 96精品高清视频在线观看软件特色 | 久久婷婷久久 | 亚洲精品在线免费看 | 久久久精品国产一区二区电影四季 | 成人资源在线 | 五月婷婷视频在线观看 | 久草视频2 | 国产网站av | 国产精品久久久久久久久久久久午夜 | 国产色影院 | 国产视频一区精品 | 揉bbb玩bbb少妇bbb | 1000部18岁以下禁看视频 | 国产精品视频永久免费播放 | 在线观看中文字幕网站 | 99成人免费视频 | 天天射天天干天天爽 | 不卡的av在线播放 | 国内久久看 | 日韩精品欧美视频 | 日本在线视频网址 | 碰超人人 | 手机在线日韩视频 | 色婷婷在线视频 | 日韩国产高清在线 | 亚洲成人av免费 | 91免费观看视频网站 | 中文字幕一区二区三区乱码在线 | 国产精品中文久久久久久久 | 午夜av片| 天天爽天天搞 | 伊人首页| 国产精品久久久久久久久久久久 | 亚洲高清在线观看视频 | 国产超碰97| 国产精品久久久久久久久岛 | 国产免费专区 | 亚洲国产中文字幕在线视频综合 | 免费看一级 | 国产高清av免费在线观看 | 91视频a | 日本bbbb摸bbbb | 96亚洲精品久久久蜜桃 | 精品麻豆 | 久久在线一区 | 色综合五月天 | 国产成人福利在线观看 | 97电影网站 | 久久久精品一区二区三区 | av中文字幕免费在线观看 | 成人网大片| 国产在线一区二区三区播放 | 亚洲视频 中文字幕 | av再线观看| 91精品国产91久久久久 | 国产日韩精品在线观看 | av中文字幕在线免费观看 | 在线国产能看的 | 五月婷婷丁香激情 | 五月天综合网站 | 久艹在线免费观看 | 精品国产91亚洲一区二区三区www | 免费观看www7722午夜电影 | 久久精品一区二区国产 | 天天操天天是 | 天天射综合网视频 | 香蕉看片 | 美女网站色在线观看 | 狠狠色丁香婷综合久久 | 久久久久女人精品毛片九一 | 久艹视频在线观看 | 久久夜色精品国产欧美乱极品 | 久黄色 | 香蕉视频免费在线播放 | 免费涩涩网站 | 99视频国产精品 | 伊人伊成久久人综合网小说 | www黄色av | 夜夜夜影院 | 黄视频色网站 | 日韩欧美在线观看一区二区三区 | 91亚色视频 | 国产精品综合久久久 | 插婷婷 | www国产亚洲 | 久久婷婷一区 | 在线色亚洲 | 国产精品福利久久久 | 国产99久久久国产精品免费二区 | 久久成人午夜 | 四虎成人精品永久免费av | www好男人 | 国产露脸91国语对白 | 天天综合成人 | 国产精品成人国产乱一区 | 久久这里只有精品久久 | 久久综合九九 | 国产原创中文在线 | 天天干com | 国产一区二区不卡在线 | 亚洲精品在线电影 | 91亚洲欧美激情 | 中文在线免费看视频 | 国产一级电影在线 | 久久精品久久99精品久久 | 国产又粗又猛又爽又黄的视频先 | 久久国产精品久久w女人spa | 成人丝袜 | 不卡的av | 一级黄色电影网站 | 国产精品破处视频 | 激情五月婷婷激情 | 国产区欧美| 久草在线免费资源站 | 四虎免费av| 麻豆国产视频下载 | 在线观看一区二区精品 | 国产麻豆成人传媒免费观看 | 在线观看视频中文字幕 | 在线免费观看视频a | 久久国产一区二区 | 免费精品久久久 | 色视频网站在线 | 天天干夜夜操视频 | 最新av免费 | 9999精品免费视频 | 91久久丝袜国产露脸动漫 | 久久精品视频在线看 | 三级黄色大片在线观看 | 91精品国产成人观看 | 亚洲极色 | 一级一级一片免费 | 激情五月五月婷婷 | 最近最新中文字幕 | 91一区一区三区 | 日本精品一区二区 | 尤物一区二区三区 | av大全在线观看 | 国产精品美女久久久久久久 | 日韩午夜在线播放 | 天天色天天射综合网 | 最近免费在线观看 | 国产精品久久久久久a | 国产精品久久久久久久久久久久午夜 | 在线国产高清 | 久久国产剧场电影 | 日韩视频在线不卡 | 精品超碰 | 91在线中字 | 国产欧美精品xxxx另类 | 天天射天天 | 欧美国产日韩在线观看 | 亚洲va欧美va国产va黑人 | 六月丁香伊人 | 欧女人精69xxxxxx | 精品国产乱码久久 | 91久久久久久国产精品 | 久草新在线 | 日韩中文字幕91 | 久久激情五月丁香伊人 | 亚洲狠狠| 国产精品久久久久高潮 | 一级片黄色片网站 | av网站在线免费观看 | 色婷婷视频网 | 欧美激情综合五月色丁香 | 亚洲更新最快 | 日韩久久久久久 | 69精品久久久 | 欧美日韩在线看 | 国产美女视频 | av福利在线看 | sesese图片| 国产精品美乳一区二区免费 | 日韩美精品视频 | 久久久久久久久久久综合 | 一区二区三区 中文字幕 | 国产精品综合av一区二区国产馆 | 激情视频在线观看网址 | 一级黄色大片 | 婷婷综合网 | 国产成人精品亚洲a | 久久精品一区八戒影视 | 天天干天天拍天天操 | 国产色一区 | 高清av免费一区中文字幕 | 亚洲天堂精品视频 | av成人在线播放 | 一区二区三区免费在线观看视频 | 午夜91在线 | 久久久精品二区 | 国产一区自拍视频 | 免费网站在线 | 欧美日韩国产精品一区 | 91视频在线观看大全 | 欧美日韩一级在线 | 久久精品国产一区二区三区 | 九色porny真实丨国产18 | 日韩成人黄色av | 69xxxx欧美| 四虎在线视频 | 日韩 在线观看 | 999在线精品| 国色天香在线观看 | 麻豆影视在线观看 | 成人精品电影 | 久久这里只有精品视频首页 | 中文有码在线 | 999热视频| 国产高清一区二区 | 久久久久日本精品一区二区三区 | 亚洲精品videossex少妇 | 国产日韩视频在线 | 午夜精品电影一区二区在线 | 国产精品永久久久久久久久久 | 亚洲一区精品二人人爽久久 | 国产精品一区二区你懂的 | 国产精品视频久久 | 久久久久久久久久久久久国产精品 | av一级在线| 久久免费播放视频 | 人人爽夜夜爽 | 香蕉视频免费看 | 国产精品国产三级国产aⅴ无密码 | 四虎国产永久在线精品 | www.伊人色.com | 日韩亚洲精品电影 | 免费又黄又爽的视频 | 九九综合九九 | 日韩欧美一区二区在线 | 香蕉在线影院 | 国产中文字幕国产 | 五月婷婷导航 | 综合激情久久 | 91色偷偷 | 五月天婷婷在线播放 | 日本黄色免费播放 | 黄色大片免费网站 | 亚洲欧洲日韩在线观看 | 91尤物在线播放 | 精品一区二区在线看 | 国产伦理久久精品久久久久_ | 久久久精品99 | 中文字幕av全部资源www中文字幕在线观看 | 一区精品在线 | 91网页版在线观看 | 91免费在线 | 久久久久国产成人免费精品免费 | 免费在线播放 | 美女免费黄视频网站 | 人人爽人人干 | 午夜a区| 乱男乱女www7788 | 国产伦理久久精品久久久久_ | 国产精品永久在线观看 | 婷五月激情 | 免费毛片aaaaaa | 国产精品黑丝在线观看 | 国产一区二区午夜 | 国产一级在线视频 | 精品国产一区二区三区四 | 国产精品毛片久久久久久久久久99999999 | 国产精品成人在线观看 | 久草视频在线资源 | 在线精品在线 | 亚洲成人免费观看 | 亚洲国产福利视频 | 麻豆综合网 | 五月婷婷综合久久 | 久久在线电影 | 天天综合久久综合 | 国产伦理一区二区三区 | 午夜av一区二区三区 | 日韩午夜一级片 | 伊人欧美 | 久草在线视频国产 | 伊人五月综合 | 日韩理论片在线 | 菠萝菠萝蜜在线播放 | 精品国产_亚洲人成在线 | 欧美视屏一区二区 | 亚洲国产中文在线观看 | 日韩免费在线 | 最近免费中文字幕大全高清10 | 欧美激情一区不卡 | 草久在线观看 | 91高清一区 | 久久亚洲综合色 | 日狠狠| 91一区一区三区 | 91你懂的| 精品国偷自产在线 | 在线观看电影av | 久久精品久久久久 | 在线有码中文字幕 | 亚洲国产精品日韩 | 天天操天天干天天干 | 一区二区三区在线影院 | 久久综合九色综合久久久精品综合 | 国产精品永久免费观看 | 伊人五月天.com | 天天夜夜亚洲 | 色99在线| 少妇bbbb搡bbbb桶 | 国产中文字幕免费 | 九九免费在线观看视频 | 又湿又紧又大又爽a视频国产 | 免费观看mv大片高清 | 美女网站色在线观看 | 91亚洲在线 | 在线观看成人福利 | av天天干| 99视频精品 | 热久久这里只有精品 | 日韩欧美网址 | 一区二三国产 | 日韩午夜av | 黄污网站在线 | 狠狠色丁香久久婷婷综合丁香 | 日日草夜夜操 | 97超碰超碰 | 成人一区二区三区在线 | 久久久久久高潮国产精品视 | 蜜臀aⅴ国产精品久久久国产 | 99精彩视频在线观看免费 | 99久久这里只有精品 | 一区二区三区在线视频观看58 | www.天天射| 国产午夜精品一区二区三区四区 | 91在线精品秘密一区二区 | 久久精视频 | av手机在线播放 | 成人久久久久久久久久 | 1024手机在线看 | 美女视频黄是免费的 | 欧美日韩精品免费观看 | 免费视频成人 | 日本中文字幕视频 | 91在线一区二区 | 久久久精品一区二区三区 | 亚洲男人天堂a | 午夜电影 电影 | 蜜臀久久99静品久久久久久 | 久久人人精 | 在线观看中文字幕亚洲 | 亚洲无吗av| 去看片| 丰满少妇在线观看 | 黄色亚洲免费 | 超级碰99 | 国产亚洲成人网 | 亚洲黄色三级 | 国产资源在线免费观看 | 日韩欧美一区二区不卡 | 在线激情av电影 | 天天超碰 | 99色在线观看视频 | 国产精品久久久久三级 | 久久99网站 | 97碰碰精品嫩模在线播放 | 免费成人av| 午夜精品一区二区三区视频免费看 | 国产日韩欧美在线一区 | 日本精品久久久久久 | 伊人久久在线观看 | 九九热在线视频免费观看 | 国产黄色资源 | 国产xx在线| 国产传媒中文字幕 | 欧美 日韩 国产 成人 在线 | 黄色在线免费观看网址 | 亚洲成aⅴ人在线观看 | 日批视频在线播放 | 激情视频91 | 美女视频久久久 | 91麻豆精品91久久久久同性 | 欧美一区二区三区在线观看 | 狠狠干天天射 | 中文字幕在线网 | 一区二区免费不卡在线 | 亚洲综合精品视频 | 亚洲国产中文字幕在线视频综合 | 国产中文视频 | 啪啪小视频网站 | 91久久精品日日躁夜夜躁国产 | 五月婷久久 | 亚洲黄色片一级 | 国产麻豆果冻传媒在线观看 | 国产中文字幕久久 | 国内精品一区二区 | 在线精品亚洲 | 97偷拍在线视频 | 国产手机视频在线观看 | 成人a在线观看高清电影 | 日本三级不卡视频 | 91在线观 | 五月综合激情婷婷 | 久久久一本精品99久久精品 | 日韩mv欧美mv国产精品 | 人人人爽 | 欧美成人在线网站 | 色综合天天天天做夜夜夜夜做 | 色视频网站在线观看一=区 a视频免费在线观看 | 最近中文字幕国语免费av | 国产一级黄色电影 | 国产一区二区三区四区在线 | 国产成人亚洲在线观看 | 国产精品99久久99久久久二8 | 亚洲欧美成人在线 | 亚洲a免费 | 日本中文字幕在线播放 | 综合色中文| 久久高清毛片 | 久久精品精品电影网 | 久久精品系列 | 草久久精品 | 免费高清无人区完整版 | 久综合网 | 99久久精品免费看国产 | 免费亚洲电影 | 99re国产视频 | 97超碰在线久草超碰在线观看 | 国产一级淫片在线观看 | 欧美aa级| 久久九精品 | 午夜精品一区二区三区在线播放 | 在线观看一区二区精品 | 狠狠的干狠狠的操 | 蜜桃视频精品 | 国产一级免费在线观看 | 国内精品久久久久久 | 欧美日韩精品在线播放 | 天天操天天拍 | 久久国产精品99久久久久久丝袜 | 黄色一级在线观看 | 国产精品免费大片视频 | 特级黄色一级 | 国产视频一区在线免费观看 | 特级西西444www高清大视频 | 久久久影院官网 | 日本一区二区不卡高清 | 日韩三区在线观看 | 在线亚洲人成电影网站色www | 久久久久久久久久久影视 | 天天干com | 久久少妇免费视频 | 18性欧美xxxⅹ性满足 | 91av在 | 九九九九九九精品任你躁 | 欧美日韩性视频 | 中文不卡视频 | 国产在线精品一区二区三区 | 成年人在线免费看片 | 亚洲精品日韩在线观看 | 久操操 | 麻豆影视在线观看 | 尤物97国产精品久久精品国产 | 久热色超碰 | 欧美黄污视频 | 麻花豆传媒mv在线观看网站 | 日韩一级成人av | 一区二区三区免费 | 激情网在线视频 | 婷婷电影在线观看 | 国内精品久久久久久中文字幕 | 中文字幕在线观看视频一区二区三区 | 国产 视频 久久 | 欧美日韩精品免费观看 | 一区二区视频在线观看免费 | 国内精品久久久久影院优 | 精品一区 精品二区 | www.伊人网 | 深夜成人av | 免费欧美精品 | 久久99日韩 | 成人播放器 | 色婷婷在线播放 | 97成人资源 | 波多野结衣电影久久 |