跨域失效?

springboot后端跨域addCorsMappings与拦截器冲突导致跨域失效

  1. 失效原因:
    请求处理的顺序问题,请求打到后端时,是先被拦截器拦截处理的,也就是我们配置的addCrosMappings并没有起到作用,请求直接被拦截器拦截了,而由于此时请求还没有配置跨域信息,所以就出现了跨域问题
    //预检请求处理时是预检请求则生成个预检执行器PreFlightHandler,
    //否则生成一个跨域拦截器加入拦截器链中,最终再doDispatch函数处执行,而因为拦截器是顺序执行的,如果前面执行失败异常返回后,后面的则不再执行。

    protected HandlerExecutionChain getCorsHandlerExecutionChain(HttpServletRequest request, HandlerExecutionChain chain, @Nullable CorsConfiguration config) {
        if (CorsUtils.isPreFlightRequest(request)) {
            HandlerInterceptor[] interceptors = chain.getInterceptors();
            chain = new HandlerExecutionChain(new AbstractHandlerMapping.PreFlightHandler(config), interceptors);
        } else {
            chain.addInterceptor(0, new AbstractHandlerMapping.CorsInterceptor(config));
        }
    
        return chain;
    }
    

    2:解决方案:

    将跨域配置处理置于过滤器处理:

    过滤器与拦截器的区别:
    过滤器:Filter是依赖于Servlet容器,Filter的执行由Servlet容器的init方法回调完成,适用于所有请求,Filter的生命周期由Servlet容器管理。
    拦截器:拦截器是通过aop实现的,只适用于controller,可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例.

@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//放行哪些原始域
config.addAllowedOrigin("");
//是否发送Cookie信息
config.setAllowCredentials(true);
//放行哪些原始域(请求方式)
config.addAllowedMethod("
");
//放行哪些原始域(头部信息)
config.addAllowedHeader("*");
//2.添加映射路径
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
return new CorsFilter(configSource);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值