續言
之前 知識追尋者寫過關於springboot 的跨域處理,並且介紹了跨域相關的概念;具體的可以查看這篇知識追尋者springboot教程系列文章
https://zszxz.com/category/springboot/article/16
關於跨域處理其實挺奇怪,spring, springboot, springSecurity 他們的跨域處理方式都不同!
spring的跨域處理
關於spring的跨域處理可以直接在類或者方法上使用 @CrossOrigin
達到目的;但這只能進行局部處理,如果需要全局處理則需要按如下方式進行配置
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://zszxz.com")
.allowedMethods("GET","POST","PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600);
// ...
}
}
springboot 跨域處理
在springboot 中 一般情況下可以使用 springMvc的跨域方式配置,但是有時關於系統配置jdk等問題,會造成跨域失效,則需要按如下方式進行配置
@Configuration
public class WebConfig {
@Bean
public CorsFilter corsFilter() {
//1. 添加 CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//放行哪些原始域
config.addAllowedOrigin("https://zszxz.com");
//是否發送 Cookie
config.setAllowCredentials(true);
//放行哪些請求方式
config.addAllowedMethod("*");
//放行哪些原始請求頭部信息
config.addAllowedHeader("*");
//暴露哪些頭部信息
//config.addExposedHeader("*");
//2. 添加映射路徑
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**",config);
//3. 返回新的CorsFilter
return new CorsFilter(corsConfigurationSource);
}
}
springSecurity跨域處理
在springSecurity中 配置方式和springboot 的配置區別方式不一樣 ,則需要按如下方式進行配置。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// by default uses a Bean by the name of corsConfigurationSource
.cors().and()
...
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("https://zszxz.com"));
configuration.setAllowedMethods(Arrays.asList("GET","POST"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
官方示例中,以下這種配置,知識追尋者試過,沒生效
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// if Spring MVC is on classpath and no CorsConfigurationSource is provided,
// Spring Security will use CORS configuration provided to Spring MVC
.cors().and()
...
}
}
網上 說需要將 X-Frame-Options
頭禁用調即可,當然我使用第一種方式就可以了,此方式不再嘗試, 有興趣的讀者可以進行驗證!
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 開啟允許iframe 嵌套
http.headers().frameOptions().disable();
http.csrf().disable()
// 開啟跨域
.cors().and()
.....
}
}
本套教程
- springSecurity入門(1)
- springSecurity配置(2)
- springSecurity登陸與退出json形式交互(3)
- springSecurity前后端分離集成jwt(4)
- SpringSecurity開啟注解權限(4)
- springSecurity Cors 處理(6)
源碼地址: 關注公眾號知識追尋者:回復 springSecurity 獲取