express使用CORS跨域资源共享设置中遇到的一些坑

express支持跨域中间件

  • ajax请求必须配置 withCredentials的值为true,否则请求是不会带凭据的(cookie、HTTP认证及客户端SSL证明等)
  • 服务端接收带凭据的请求必须设置响应头属性 Access-Control-Allow-Credentialstrue 否则浏览器不会把响应交给js(即responseText为空,status的值为0,而且会调用onerror()事件处理程序)
  • 当设置了 withCredentials的值为true 时服务端的 Access-Control-Allow-Origin 的属性不能为 * ,如有需要,需单独设置对应的响应头如req.headers.origin
  • IE10及更早版本都不支持 withCredentials 使用 XDomainRequest
1
2
3
4
5
6
7
8
9
10
11
12
13
setCORS() {
return (req, res, next) => {
res.header("Access-Control-Allow-Origin", req.headers.origin);
res.header("Access-Control-Allow-Credentials", true);
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
// res.header("X-Powered-By", '3.2.1');
if (req.method === 'OPTIONS') {
return res.send('support CORS')
}
next();
}
},

其他参考 :XMLHttpRequest.withCredentials