Springboot 拦截器导致 @CrossOrigin 跨域失效的解决方案
2025年2月24日小于 1 分钟
Springboot 拦截器导致 @CrossOrigin 跨域失效的解决方案
原因:CROS 复杂请求时会首先发送一个 OPTIONS 请求做嗅探,来测试服务器是否支持本次请求,请求成功后才会发送真实的请求;而 OPTIONS 请求不会携带数据,导致这个请求被拦截了,直接返回了状态码,响应头中没携带解决跨域问题的头部信息,出现了跨域问题。
解决方法:
在定义的拦截器中,把所有的 OPTIONS 请求统统放行。
详细分析见:https://blog.csdn.net/MrKorbin/article/details/104066979
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if("OPTIONS".equals(request.getMethod().toUpperCase())) {
return true;
}
String token = request.getHeader("Authorization");
//没有token
if (token.isEmpty()) {
response.setStatus(401);
}
//与存储到redis中的对比token是否正确
String redisToken = stringRedisTemplate.opsForValue().get(token);
if (!redisToken.equals(token)) {
response.setStatus(401);
System.out.println("token令牌无效");
return false;
}
//把token存储到threadLocal中
ThreadLocalUtils.set("token", token);
return true;
}