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

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

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

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

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

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

二、配置原理

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

        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;
	}

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

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

三、自定義配置

@Configuration
public class SecurityConfig {
    /**
     * 跨域資源共享過濾器
     */
    @Autowired
    @Bean
    public CorsFilter corsFilter(UrlBasedCorsConfigurationSource configurationSource){
        return new CorsFilter(configurationSource);
    }
    /**
     * 跨域資源共享過濾器配置
     */
    @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;
    }
}

        幾個要注意的地方:

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

2、方法名,第1點說了,注冊的Bean名稱是和方法名一致的,所以這里的方法名需要是“corsConfigurationSource”,不能自定義方法名。

3、上面代碼中的corsFilter()方法,可以不寫。因為從前面的Spring Security源碼中可以看出,如果沒有這個corsFilter的Bean,它也會自己new一個。如果要自定義corsFilter,同樣要注意方法名。至于參數(shù),如果有帶,需要注意參數(shù)類型(參數(shù)名可以任意),并在方法名上方多帶一個@Autowired注解,這個注解會自動找到類型為UrlBasedCorsConfigurationSource的Bean,并使用它。如果不帶參數(shù),那也可以用普通方法,先獲取corsConfigurationSource()方法返回的對象,再以些為參數(shù),new一個corsFilter對象。

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

相關(guān)文章

  • idea中使用git合并分支實踐

    idea中使用git合并分支實踐

    這篇文章主要介紹了idea中使用git合并分支實踐,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 介紹Java的大數(shù)類(BigDecimal)和八種舍入模式

    介紹Java的大數(shù)類(BigDecimal)和八種舍入模式

    在實際應(yīng)用中,需要對更大或者更小的數(shù)進行運算和處理。Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算。本文將介紹Java中的大數(shù)類BigDecimal及其八種舍入模式,有需要的可以參考借鑒。
    2016-08-08
  • Spring Boot項目集成UidGenerato的方法步驟

    Spring Boot項目集成UidGenerato的方法步驟

    這篇文章主要介紹了Spring Boot項目集成UidGenerato的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Java 反射機制實例詳解

    Java 反射機制實例詳解

    這篇文章主要介紹了Java 反射機制實例詳解的相關(guān)資料,這里對java中反射機制進行了詳細的分析,需要的朋友可以參考下
    2017-09-09
  • SpringBoot 如何讀取pom.xml中的值

    SpringBoot 如何讀取pom.xml中的值

    這篇文章主要介紹了SpringBoot 如何讀取pom.xml中的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java中獲取Class對象的三種方式詳解

    Java中獲取Class對象的三種方式詳解

    本文介紹了Java中獲取Class對象的三種常見方式:使用.class語法、使用Class.forName()方法以及使用.getClass()方法,需要的朋友可以參考下
    2023-12-12
  • Java設(shè)計模式之橋接模式詳解(Bridge Pattern)

    Java設(shè)計模式之橋接模式詳解(Bridge Pattern)

    橋接模式是一種結(jié)構(gòu)型設(shè)計模式,旨在將抽象部分與其實現(xiàn)部分分離,從而使兩者可以獨立地變化,橋接模式通過組合關(guān)系代替繼承關(guān)系,將抽象和實現(xiàn)解耦,使代碼更具擴展性和維護性
    2025-02-02
  • 利用Java實現(xiàn)更改Word中的頁面大小和頁面方向

    利用Java實現(xiàn)更改Word中的頁面大小和頁面方向

    這篇文章主要為大家詳細介紹了一種高效便捷的方法——通過Java應(yīng)用程序,以編程方式更改Word中的頁面大小和頁面方向,感興趣的可以了解一下
    2023-03-03
  • SpringBoot處理接口冪等性的兩種方法詳解

    SpringBoot處理接口冪等性的兩種方法詳解

    接口冪等性處理算是一個非常常見的需求了,我們在很多項目中其實都會遇到。本文為大家總結(jié)了兩個處理接口冪等性的兩種常見方案,需要的可以參考一下
    2022-06-06
  • 聊聊DecimalFormat的用法及各符號的意義

    聊聊DecimalFormat的用法及各符號的意義

    這篇文章主要介紹了DecimalFormat的用法及各符號的意義,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論

达日县| 墨江| 石家庄市| 富顺县| 新民市| 双流县| 达孜县| 舒兰市| 松原市| 肇东市| 上饶市| 静安区| 凤山县| 二连浩特市| 德江县| 高雄县| 枣强县| 凯里市| 浪卡子县| 措美县| 张掖市| 合肥市| 安仁县| 惠州市| 永和县| 张掖市| 内乡县| 太仓市| 玉林市| 项城市| 得荣县| 集安市| 闽侯县| 东乌| 信阳市| 海淀区| 淳化县| 洪洞县| 肥西县| 奉化市| 勐海县|