续言
之前 知识追寻者写过关于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 获取