在项目中使用token取代session实现登录鉴权时,Vue中每次请求都会带有携带token的请求头Authorization ,
此时前端会发送两次请求,在跨域请求中,浏览器会首先发送一个预检请求(Preflight Request)来检查服务器是否允许跨域请求。
预检请求是一个 OPTIONS 请求,其中包含一个 Access-Control-Request-Headers 头部信息,用于列出实际请求中会包含的请求头。服务器需要正确响应预检请求,并在响应中包含 Access-Control-Allow-Headers 头部信息,以允许实际请求中包含列出的请求头。
如果在预检请求中使用拦截器检查请求头信息,但只有第一次预请求会被拦截,可能是因为您的服务器没有正确响应预检请求。在预检请求中,浏览器会发送一个 Access-Control-Request-Headers 头部信息来列出实际请求中会包含的请求头。
如果服务器没有正确响应预检请求,即没有包含 Access-Control-Allow-Headers 头部信息,浏览器就会认为服务器不允许实际请求中包含列出的请求头,从而不会发送实际请求,也就不会触发拦截器。
解决方法:
发现,只需要我把这个请求过滤掉即可,让它可以实际请求,使得我的自定义请求头 - 特定的请求头(access-control-request-headers=content-type,headeruserid,headerusertoken)可以接收到我就可以进行判断了。
if (“OPTIONS”.equals(request.getMethod().toUpperCase())) {
return true;
}