这是我配置的跨域处理
@Configuration
public class CORSConfiguration extends WebMvcConfigurationSupport {
/**
* 这里主要是处理token统一拦截
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截路径可自行配置多个 可用 ,分隔开可以设置拦截的接口和不拦截的接口
registry.addInterceptor(new JwtInterceptor()).addPathPatterns("/user/**").
excludePathPatterns("/login");
}
/**
* 这里主要为了解决跨域问题,所以重写addCorsMappings方法
*/
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.exposedHeaders("access-control-allow-headers",
"access-control-allow-methods",
"access-control-allow-origin",
"access-control-max-age",
"X-Frame-Options")
.allowCredentials(false).maxAge(3600);
super.addCorsMappings(registry);
}
}
很好这个配置成功结决了我的跨域问题,直到我第二天配置了全局的自定义拦截器后出现了这个问题-------》跨域问题再现,天哪!!!!
这是我那该死的自定义拦截器
//token统一拦截处理
/**
* token验证拦截
*/
@Configuration
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 在拦截器里判断是不是询问接口能不能过的,是的就放行
// if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
// System.out.println("跨域访问");
//return true;
// }
// 取得token
String token = request.getHeader("token");
if (token != null) {
DecodedJWT decodedJWT = JwtUtils.verify(token);
if (decodedJWT != null) {
User user = JwtUtils.tokenParse(decodedJWT);
System.out.println(user);
System.out.println("我是拦截器的------》" + token);
return true;
} else {
return false;
}
} else {
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
然而这一切都是源于对知识的匮乏,我深知自己的不足,于是不断查找解决的办法
原因分析
接口请求被拦截器拦截了,然后浏览器控制太就会打印跨域问题(后端不给我跨域处理,我进去获取数据的门都没有)
解决有二:
- 在拦截器判断一下是否是接口请求,如果是就放行,然后进行token验证。
在拦截器添加这个就好了
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
return true;
}
- 使用过滤器来配置跨域和拦截器的优先级,优先级越高,就先执行,所以可以使用过滤器实现(先执行跨域处理再执行拦截器的token验证)即可。
关于拦截器的处理下回分解,等我搞懂再续………