springboot 三种跨域处理方式:
1.通过Filter方式实现全局跨域
2.通过Interceptor方式实现全局跨域
3.SpringBoot 自带跨域CrossOrigin注解
Filter方式实现了跨域,那么Interceptor方式跨域就无效;
1.通过Filter方式实现全局跨域
自定义的filter
/**
*
* 通过Filter实现全局跨域支持
*/
@Slf4j
@Component
public class CorsConfig implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("CorsConfig init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("CorsConfig doFilter");
HttpServletRequest request1 = (HttpServletRequest) request;
HttpServletResponse response1 = (HttpServletResponse) response;
if (request1.getHeader("Origin")!=null){
response1.setHeader("Access-Controller-Allow-Origin"
,request1.getHeader("Origin"));
}
response1.setHeader("Access-Control-Allow-Credentials","true");
response1.setHeader("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS,HEAD");
response1.setHeader("Access-Control-Max-Age","3600");
response1.setHeader("Access-Control-Allow-Headers","Content-Type, Accept, X-Requested-With, remember-me");
chain.doFilter(request,response);
}
@Override
public void destroy() {
log.info("CorsConfig destroy");
}
}
还有一种
org.springframework.web.filter 提供的filter跨域类
/**
* 全局跨域
* CorsFilter 实现了Filter
*
* :一个http请求,先走filter,到达servlet后才进行拦截器的处理,
* 所以我们可以把cors放在filter里,就可以优先于权限拦截器执行。
*/
@Slf4j
@Configuration
public class GlobalCorsConfig {
//允许跨域调用的过滤器
@Bean
public CorsFilter corsFilter() {
log.info("TokenConfig corsFilter");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", addcorsConfig());
return new CorsFilter(source);
}
private CorsConfiguration addcorsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
List<String> list = new ArrayList<>();
list.add("*");
corsConfiguration.setAllowedOrigins(list);
/*
// 请求常用的三种配置,*代表允许所有,
//当时你也可以自定义属性(比如header只能带什么,只能是post方式等等)
*/
//允许跨越发送cookie
corsConfiguration.setAllowCredentials(true);
//允许所有域名进行跨域调用
corsConfiguration.addAllowedOrigin("*");
//放行全部原始头信息
corsConfiguration.addAllowedHeader("*");
//允许所有请求方法跨域调用
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
}
2.通过Interceptor方式实现全局跨域
/**
*
* 也可以mapping,跨域设置
*/
@Slf4j
@Configuration
public class TokenConfig implements WebMvcConfigurer {
/**
* 拦截器实现 跨域支持
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
log.info("TokenConfig addInterceptors addCorsMappings");
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT","OPTIONS","HEAD")
.allowedHeaders("*")
.maxAge(3600);
}
}
第三种方式:SpringBoot 自带跨域CrossOrigin注解
放在RestController的类上或者方法上,还能自定义那些域名可以跨域
@CrossOrigin(origins = "", allowedHeaders = "")