前置说明
在token拦截器中,处理非法 (包含过期)token 的方法无非就是两种,一种是直接 return false,另一种是 throws Exception。如果是使用 throws Exception ,那么直接 http status code 就是500,在前端也很好捕捉。但是如果直接 return false,那浏览器还是会报出跨域请求的错误。
解决方案
问题原因
其实导致这个问题的原因很简单,如果直接 token 的拦截器返回 false就直接终止请求,返回 response。也就是说我们之前配置的跨域函数不会被执行。
造成前端报错跨域请求的根本原因在于,response 中没有必要的头部信息,让前端认为你这个服务器是可以被访问的。所以显而易见,我们只需要在每一个 return false 的前面加上头部信息就好了。所以我就自己写了addHeader函数。
public void addHeader(HttpServletRequest request, HttpServletResponse response){
String origin = request.getHeader("Origin");
response.addHeader("Access-Control-Allow-Origin", origin);
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
response.addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Max-Age", "3600");
}
其中 Access-Control-Allow-Origin 不能 = “*”,这样前端还是会报跨域请求错误。必须拿到源地址,指向源地址才可以。