配置WebMvcConfigurer全局跨域,不生效的原因及解决办法

先说结论,拦截器会让WebMvcConfigurer全局跨域配置失效,这种情况下可以使用过滤器进行跨域处理。
我在写自己的后端接口时使用了下面的代码来解决跨域,不知道为什么没有生效,有趣的是登录并获取token的login接口却跨域生效了,真的让人头大

@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedOrigins("*")
.allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
.allowedHeaders("*")
.exposedHeaders("*");
}
}
在此附上我的请求拦截器代码:

@Component
public class RequestContextInterceptor implements HandlerInterceptor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private LogService logService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logService.insertAccessLog(request);
String token = request.getHeader("Authorization");
if(Objects.equals(request.getRequestURI(), "/login")){
return true;
}
if(!TokenUtils.verify(token)){
postInterceptor(response,"token验证失败的访问");
return false;
}
return true;

}
protected void postInterceptor(HttpServletResponse response,String message) throws Exception {
logger.error(message);
// 如果被拦截,返回信息
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
ObjectMapper objectMapper = new ObjectMapper();
response.getWriter().println(objectMapper.writeValueAsString(Response.fail(299, null, "token验证失败")));
return;
}
}
能看到因为某些原因拦截器这里是没有对login接口做拦截的,难不成是拦截器与WebMvcConfigurer跨域配置冲突的问题?

果不其然,改为过滤器解决跨域问题之后就解决了,在此附上过滤器跨域代码:

@Component
public class CorsFilter implements Filter {

@Override
public void destroy() {

}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");

chain.doFilter(req, res);

}

@Override
public void init(FilterConfig arg0) throws ServletException {

}

}
结论
在使用拦截器时不能使用WebMvcConfigurer跨域配置,拦截器是会让跨域配置失效(除非这个请求不会被拦截,像我这里的login接口),改为过滤器完美解决

posted @   Larson#HL  阅读(1228)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示