最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring的跨域的幾個(gè)方案

 更新時(shí)間:2022年02月18日 14:23:40   作者:周杰倫本人  
這篇文章主要介紹了Spring的跨域的幾個(gè)方案,CrossOrigin、addCorsMappings、CorsFIlter等方案,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助

1.@CrossOrigin

@CrossOrigin可以添加到方法上,也可以添加到Controller

AbstractHandlerMethodMapping的內(nèi)部類MappingRegistry的register:

public void register(T mapping, Object handler, Method method) {
? ?// Assert that the handler method is not a suspending one.
? ?if (KotlinDetector.isKotlinType(method.getDeclaringClass())) {
? ? ? Class<?>[] parameterTypes = method.getParameterTypes();
? ? ? if ((parameterTypes.length > 0) && "kotlin.coroutines.Continuation".equals(parameterTypes[parameterTypes.length - 1].getName())) {
? ? ? ? ?throw new IllegalStateException("Unsupported suspending handler method detected: " + method);
? ? ? }
? ?}
? ?this.readWriteLock.writeLock().lock();
? ?try {
? ? ? HandlerMethod handlerMethod = createHandlerMethod(handler, method);
? ? ? validateMethodMapping(handlerMethod, mapping);
? ? ? this.mappingLookup.put(mapping, handlerMethod);

? ? ? List<String> directUrls = getDirectUrls(mapping);
? ? ? for (String url : directUrls) {
? ? ? ? ?this.urlLookup.add(url, mapping);
? ? ? }

? ? ? String name = null;
? ? ? if (getNamingStrategy() != null) {
? ? ? ? ?name = getNamingStrategy().getName(handlerMethod, mapping);
? ? ? ? ?addMappingName(name, handlerMethod);
? ? ? }

? ? ? CorsConfiguration corsConfig = initCorsConfiguration(handler, method, mapping);
? ? ? if (corsConfig != null) {
? ? ? ? ?this.corsLookup.put(handlerMethod, corsConfig);
? ? ? }

? ? ? this.registry.put(mapping, new MappingRegistration<>(mapping, handlerMethod, directUrls, name));
? ?}
? ?finally {
? ? ? this.readWriteLock.writeLock().unlock();
? ?}
}
  • @CrossOrigin 注解在AbstractHandlerMethodMapping的內(nèi)部類MappingRegistry的register方法中完成解析,@CrossOrigin注解中的內(nèi)容會(huì)被解析成一個(gè)配置對(duì)象CorsConfiguration
  • @CrossOrigin所標(biāo)記的請(qǐng)求方法對(duì)象HandlerMethodCorsConfiguration一一對(duì)應(yīng)存入corsLookup的map集合中
  • 當(dāng)請(qǐng)求到達(dá)DispatcherServlet的doDispatch方法之后,調(diào)用AbstractHandlerMapping的getHandler方法獲取執(zhí)行鏈HandlerExecutionChain時(shí),會(huì)從map中獲取CorsConfiguration對(duì)象
  • 根據(jù)獲取到的CorsConfiguration對(duì)象構(gòu)建一個(gè)CorsInterceptor攔截器
  • CorsInterceptor攔截器中觸發(fā)對(duì)CorsProcessor的processRequest方法調(diào)用,跨域請(qǐng)求的校驗(yàn)工作將在該方法中完成。

2.addCorsMappings

@CrossOrigin是添加在不同的Controller中 全局配置

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
? ? @Override
? ? public void addCorsMappings(CorsRegistry registry) {
? ? ? ? registry.addMapping("/**")
? ? ? ? ? ? ? ? .allowedMethods("*")
? ? ? ? ? ? ? ? .allowedOrigins("*")
? ? ? ? ? ? ? ? .allowedHeaders("*")
? ? ? ? ? ? ? ? .allowCredentials(false)
? ? ? ? ? ? ? ? .exposedHeaders("")
? ? ? ? ? ? ? ? .maxAge(3600);
? ? }
}

全局配置和@CrossOrigin注解相同,都是在CorsInterceptor攔截器中觸發(fā)對(duì)CorsProcessor的processRequest方法調(diào)用,最終在該方法中完成跨域請(qǐng)求的校驗(yàn)工作

  • registry.addMapping(“/**”)方法中配置了一個(gè)CorsRegistration對(duì)象,該對(duì)象中包含了一個(gè)路徑攔截規(guī)則,同時(shí)CorsRegistration還包含了一個(gè)CorsConfiguration配置對(duì)象,該對(duì)象用來(lái)保存這里跨域相關(guān)的配置。
  • WebMvcConfigurationSupportrequestMappingHandlerMapping方法中觸發(fā)了addCorsMappings方法執(zhí)行,將獲取到的CorsRegistration對(duì)象重新組裝成一個(gè)UrlBasedCorsConfigurationSource對(duì)象,該對(duì)象保存了攔截規(guī)則和CorsConfiguration對(duì)象的映射關(guān)系。
  • 將新建的UrlBasedCorsConfigurationSource對(duì)象賦值給AbstractHandlerMapping的corsConfigurationSource屬性
  • 當(dāng)請(qǐng)求到達(dá)時(shí)的處理方法和@CrossOrigin注解處理流程一樣,在AbstractHandlerMapping的getHandler方法處理,從corsConfigurationSource中獲取CorsConfiguration配置對(duì)象,而@CrossOrigin從map中獲取CorsConfiguration對(duì)象。如果兩處都可以獲取到CorsConfiguration對(duì)象,則獲取到的對(duì)象屬性值進(jìn)行合并。
  • 根據(jù)獲取到的CorsConfiguration對(duì)象構(gòu)造CorsInterceptor攔截器
  • CorsInterceptor攔截器中觸發(fā)對(duì)CorsProcessor的processRequest方法調(diào)用,跨域請(qǐng)求的校驗(yàn)工作將在該方法中完成。

這里的跨域校驗(yàn)是通過(guò)DispatcherServlet中的方法觸發(fā)的,DispatcherServlet在Filter之后執(zhí)行

3.CorsFIlter

@Configuration
public class WebMvcConfig {
? ? @Bean
? ? FilterRegistrationBean<CorsFilter> corsFilter() {
? ? ? ? FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
? ? ? ? CorsConfiguration corsConfiguration = new CorsConfiguration();
? ? ? ? corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
? ? ? ? corsConfiguration.setAllowedMethods(Arrays.asList("*"));
? ? ? ? corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:8081"));
? ? ? ? corsConfiguration.setMaxAge(3600L);
? ? ? ? UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
? ? ? ? source.registerCorsConfiguration("/**", corsConfiguration);
? ? ? ? registrationBean.setFilter(new CorsFilter(source));
? ? ? ? registrationBean.setOrder(-1);
? ? ? ? return registrationBean;
? ? }
}
  • 手動(dòng)創(chuàng)建CorsConfiguration對(duì)象
  • 創(chuàng)建UrlBasedCorsConfigurationSource對(duì)象,將過(guò)濾器的攔截規(guī)則和CorsConfiguration對(duì)象之間的映射關(guān)系由UrlBasedCorsConfigurationSource中的corsConfiguration變量保存起來(lái)。
  • 最后創(chuàng)建CorsFilter 設(shè)置優(yōu)先級(jí)

CorsFilter的doFilterInternal方法:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
? ? CorsConfiguration corsConfiguration = this.configSource.getCorsConfiguration(request);
? ? boolean isValid = this.processor.processRequest(corsConfiguration, request, response);
? ? if (isValid && !CorsUtils.isPreFlightRequest(request)) {
? ? ? ? filterChain.doFilter(request, response);
? ? }
}

觸發(fā)對(duì)CorsProcessorprocessRequest方法調(diào)用,跨域請(qǐng)求的校驗(yàn)工作將在該方法中完成

到此這篇關(guān)于Spring的跨域的幾個(gè)方案的文章就介紹到這了,更多相關(guān)Spring的跨域方案內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基于Session登錄驗(yàn)證的實(shí)現(xiàn)示例

    Java基于Session登錄驗(yàn)證的實(shí)現(xiàn)示例

    基于Session的登錄驗(yàn)證方式是最簡(jiǎn)單的一種登錄校驗(yàn)方式,本文主要介紹了Java基于Session登錄驗(yàn)證的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • SpringBoot中的異步執(zhí)行方法詳解

    SpringBoot中的異步執(zhí)行方法詳解

    這篇文章主要介紹了SpringBoot中的異步執(zhí)行方法詳解,ThreadpoolTaskExecutor不需要手動(dòng)的創(chuàng)建當(dāng)前線程池,但往往我們還是會(huì)手動(dòng)指定,具體原因看源碼就可以自有判斷,需要的朋友可以參考下
    2023-10-10
  • Java遞歸尋路實(shí)現(xiàn),你真的理解了嗎

    Java遞歸尋路實(shí)現(xiàn),你真的理解了嗎

    遞歸就是一個(gè)過(guò)程或函數(shù)在其定義或說(shuō)明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的規(guī)模較小的問(wèn)題來(lái)求解,需要的朋友可以參考下
    2021-08-08
  • IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn)

    IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn)

    本文主要介紹了IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Spring context:component-scan的使用及說(shuō)明

    Spring context:component-scan的使用及說(shuō)明

    這篇文章主要介紹了Spring context:component-scan的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 手把手教你如何利用SpringBoot實(shí)現(xiàn)審核功能

    手把手教你如何利用SpringBoot實(shí)現(xiàn)審核功能

    審核功能經(jīng)過(guò)幾個(gè)小時(shí)的奮戰(zhàn)終于完成了,現(xiàn)在我就與廣大網(wǎng)友分享我的成果,這篇文章主要給大家介紹了關(guān)于如何利用SpringBoot實(shí)現(xiàn)審核功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Nacos進(jìn)程自動(dòng)消失的原因分析

    Nacos進(jìn)程自動(dòng)消失的原因分析

    當(dāng)使用低版本Nacos時(shí),啟動(dòng)后關(guān)閉窗口或執(zhí)行control+c會(huì)導(dǎo)致Nacos服務(wù)自動(dòng)退出,原因是Nacos并未作為后臺(tái)進(jìn)程運(yùn)行,解決方法是在啟動(dòng)Nacos時(shí),采用后臺(tái)進(jìn)程方式啟動(dòng),這樣即使關(guān)閉窗口,Nacos服務(wù)也不會(huì)退出,從而保證服務(wù)的持續(xù)運(yùn)行
    2023-02-02
  • Java進(jìn)行反編譯生成.java文件方式(javap、jad下載安裝使用)

    Java進(jìn)行反編譯生成.java文件方式(javap、jad下載安裝使用)

    這篇文章主要介紹了Java進(jìn)行反編譯生成.java文件方式(javap、jad下載安裝使用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring集成Druid連接池及監(jiān)控配置的全過(guò)程

    Spring集成Druid連接池及監(jiān)控配置的全過(guò)程

    java程序很大一部分要操作數(shù)據(jù)庫(kù),為了提高性能操作數(shù)據(jù)庫(kù)的時(shí)候,有不得不使用數(shù)據(jù)庫(kù)連接池,下面這篇文章主要給大家介紹了關(guān)于Spring集成Druid連接池及監(jiān)控配置的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • mybatis plus or and 的合并寫(xiě)法實(shí)例

    mybatis plus or and 的合并寫(xiě)法實(shí)例

    這篇文章主要介紹了mybatis plus or and 的合并寫(xiě)法實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論

德钦县| 泸定县| 武功县| 寿宁县| 曲阳县| 营口市| 吉安市| 绥阳县| 攀枝花市| 西藏| 丰县| 呼伦贝尔市| 莆田市| 恩平市| 宝丰县| 随州市| 平顶山市| 三门峡市| 西乡县| 潼南县| 兰州市| 陆河县| 东平县| 长沙县| 安图县| 广宗县| 聂荣县| 建阳市| 集贤县| 阿坝| 昌都县| 常州市| 九寨沟县| 榆社县| 大连市| 沙坪坝区| 中山市| 新野县| 衢州市| 海南省| 天全县|