欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Security中自定義cors配置及原理解析

 更新時(shí)間:2024年10月08日 10:46:16   作者:興趣廣泛的程序猿  
在Spring框架中,通過(guò)自定義CORS配置可根據(jù)實(shí)際情況調(diào)整URL的協(xié)議、主機(jī)、端口等,以適應(yīng)"同源安全策略",配置原理涉及CorsConfigurer和CorsFilter,自定義配置需要注意@Configuration注解、方法名以及可能的@Autowired注解

一、為什么要自定義cors配置

        在使用Spring框架時(shí),Spring Security組件提供了簡(jiǎn)便的cors配置方案,使程序開(kāi)發(fā)者可以快速的實(shí)現(xiàn)“同源安全策略”。關(guān)于cors,可以參數(shù)之前的一篇文章--關(guān)于Spring Security的CORS_springsecurity cors

        由于cors涉及到URL 的協(xié)議(Protocol)、主機(jī)(Host)、端口(Port,這些東西在每個(gè)程序上的情況不同,所以一般情況下都是需要根據(jù)實(shí)際情況來(lái)定制適合的cors配置。

二、配置原理

        我們可以先看下Spring Security組件的一個(gè)源碼。

        org.springframework.security.config.annotation.web.configurers.CorsConfigurer.class

    @Override
	public void configure(H http) {
		ApplicationContext context = http.getSharedObject(ApplicationContext.class);
		CorsFilter corsFilter = getCorsFilter(context);
		Assert.state(corsFilter != null, () -> "Please configure either a " + CORS_FILTER_BEAN_NAME + " bean or a "
				+ CORS_CONFIGURATION_SOURCE_BEAN_NAME + "bean.");
		http.addFilter(corsFilter);
	}
	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);
		}
		if (mvcPresent) {
			return MvcCorsFilter.getMvcCorsFilter(context);
		}
		return null;
	}

        這段源碼簡(jiǎn)單、清晰,兩個(gè)方法,一個(gè)公有,一個(gè)私有。configure(H http)被外部調(diào)用,實(shí)現(xiàn)了兩件事,獲取一個(gè)corsFilter(過(guò)濾器)并把這個(gè)filter添加到傳入的這個(gè)名為“http”的對(duì)象中。這里也剛好能看出Configurer和Filter的一些關(guān)系--configurer會(huì)在拿到filter后,通過(guò)addFilter(filter)方法將一個(gè)filter添加到HttpSecurity對(duì)象中。

        再看下getCorsFilter(ApplicationContext context)方法,4個(gè)if分支,最終的任務(wù)就是new一個(gè)CorsFilter并返回。所以自定義cors配置時(shí),可以選擇的方法有很多,這里選擇創(chuàng)建一個(gè)CorsConfigurationSource類(lèi)型的Bean。這里的getBean方法參數(shù)是name和type。所以我們?cè)趧?chuàng)建這個(gè)Bean的時(shí)候,需要確保Bean的名稱(chēng)為“corsConfigurationSource”(CORS_CONFIGURATION_SOURCE_BEAN_NAME對(duì)應(yīng)的字符串),不然這里的getBean會(huì)找不到我們自定義創(chuàng)建的CorsConfigurationSource。

三、自定義配置

@Configuration
public class SecurityConfig {
    /**
     * 跨域資源共享過(guò)濾器
     */
    @Autowired
    @Bean
    public CorsFilter corsFilter(UrlBasedCorsConfigurationSource configurationSource){
        return new CorsFilter(configurationSource);
    }
    /**
     * 跨域資源共享過(guò)濾器配置
     */
    @Bean
    public UrlBasedCorsConfigurationSource corsConfigurationSource(){
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOriginPattern("http://localhost*");
        source.registerCorsConfiguration("/**",corsConfiguration);
        return source;
    }
}

        幾個(gè)要注意的地方:

1、類(lèi)名上方的@Configuration注解,這個(gè)是為了指定該類(lèi)為配置類(lèi),Spring容器啟動(dòng)時(shí),會(huì)調(diào)用帶有@Bean注解的方法來(lái)生成對(duì)應(yīng)實(shí)例,并將實(shí)例注冊(cè)為與方法名相同的Bean,并管理起來(lái)。

2、方法名,第1點(diǎn)說(shuō)了,注冊(cè)的Bean名稱(chēng)是和方法名一致的,所以這里的方法名需要是“corsConfigurationSource”,不能自定義方法名。

3、上面代碼中的corsFilter()方法,可以不寫(xiě)。因?yàn)閺那懊娴腟pring Security源碼中可以看出,如果沒(méi)有這個(gè)corsFilter的Bean,它也會(huì)自己new一個(gè)。如果要自定義corsFilter,同樣要注意方法名。至于參數(shù),如果有帶,需要注意參數(shù)類(lèi)型(參數(shù)名可以任意),并在方法名上方多帶一個(gè)@Autowired注解,這個(gè)注解會(huì)自動(dòng)找到類(lèi)型為UrlBasedCorsConfigurationSource的Bean,并使用它。如果不帶參數(shù),那也可以用普通方法,先獲取corsConfigurationSource()方法返回的對(duì)象,再以些為參數(shù),new一個(gè)corsFilter對(duì)象。

到此這篇關(guān)于Spring Security中自定義cors配置的文章就介紹到這了,更多相關(guān)Spring Security cors配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • swagger文檔增強(qiáng)工具knife4j使用圖文詳解

    swagger文檔增強(qiáng)工具knife4j使用圖文詳解

    這篇文章主要介紹了swagger文檔增強(qiáng)工具knife4j使用詳解,想要使用knife4j非常簡(jiǎn)單,只要在Springboot項(xiàng)目中引入knife4j的依賴(lài)即可,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問(wèn)題

    MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Spring中WebDataBinder使用詳解

    Spring中WebDataBinder使用詳解

    這篇文章主要為大家詳細(xì)介紹了Spring中WebDataBinder的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • ASM源碼學(xué)習(xí)之ClassReader、ClassVisitor與ClassWriter詳解

    ASM源碼學(xué)習(xí)之ClassReader、ClassVisitor與ClassWriter詳解

    這篇文章主要給大家介紹了ASM源碼之ClassReader、ClassVisitor與ClassWriter的相關(guān)資料,文中介紹的非常相信,相信對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • 詳解Spring Security中權(quán)限注解的使用

    詳解Spring Security中權(quán)限注解的使用

    這篇文章主要為大家詳細(xì)介紹一下Spring Security中權(quán)限注解的使用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下
    2022-05-05
  • Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解

    Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解

    這篇文章主要介紹了Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解,類(lèi)加載器是Java虛擬機(jī)(JVM)的一個(gè)重要組成部分,它的主要作用是將類(lèi)的字節(jié)碼加載到內(nèi)存中,并生成對(duì)應(yīng)的Class對(duì)象,需要的朋友可以參考下
    2023-07-07
  • SpringMVC使用注解配置方式

    SpringMVC使用注解配置方式

    這篇文章主要為大家介紹了SpringMVC使用注解配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java 添加、更新和移除PDF超鏈接的實(shí)現(xiàn)方法

    Java 添加、更新和移除PDF超鏈接的實(shí)現(xiàn)方法

    PDF超鏈接用一個(gè)簡(jiǎn)單的鏈接包含了大量的信息,滿(mǎn)足了人們?cè)诓徽加锰嗫臻g的情況下渲染外部信息的需求。這篇文章主要介紹了Java 添加、更新和移除PDF超鏈接的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-05-05
  • MultipartFile文件判斷是否存在的操作

    MultipartFile文件判斷是否存在的操作

    這篇文章主要介紹了MultipartFile文件判斷是否存在的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 不可不知道的10個(gè)java謊言

    不可不知道的10個(gè)java謊言

    這篇文章主要為大家詳細(xì)介紹了不可不知道的10個(gè)java謊言,大家一定要謹(jǐn)慎,需要了解的朋友可以參考一下
    2016-09-09

最新評(píng)論