问题背景
公司项目是前后端分离的,最近要求在请求时都要在请求头加入自定义的 token
,在做接口调试时,前端总是请求不通,然而自己用 POSTMAN
等工具时都可以,这就出现了问题,也就是 复杂请求 的跨域问题。
问题分析
部分文段摘自 跨域资源共享 CORS 详解
复杂请求
浏览器将CORS
请求分成两类:简单请求(simple request
)和非简单请求(not-so-simple request
)。
只要同时满足以下两大条件,就属于简单请求。
- 请求方法是以下三种方法之一:
HEAD GET POST
HTTP
的头信息不超出以下几种字段:
这是为了兼容表单(Accept Accept-Language Content-Language Last-Event-ID Content-Type: 只限于三个值 application/x-www-form-urlencoded multipart/form-data text/plain
form
),因为历史上表单一直可以发出跨域请求。AJAX
的跨域设计就是,只要表单可以发,AJAX
就可以直接发。
凡是不同时满足上面两个条件,就属于非简单请求。
预检请求
非简单请求的CORS
请求,会在正式通信之前,增加一次HTTP
查询请求,称为"预检"请求(preflight
)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP
动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest
请求,否则就报错。
过滤器
由于项目中的 shiro
使用了 UserFilter
, 下面是其代码:
public class UserFilter extends AccessControlFilter {
public UserFilter() {