最近在用node.js写自己的后台时遇见了跨域问题,之前处理跨域都是在前端配置代理解决的,这次打算在后台解决,中途也遇
到了一些坑,比如我在请求头里加了一个自定义的参数token,结果后台配置的时候没有允许请求能够携带该参数,造成预检请求
发出后,就没任何响应了。为此折腾了半天才发现问题。。。还是对它不够了解,所以查阅了相关资料,下面做出自己的理解:
都知道跨域是因为浏览器的同源策略造成的,当客户端访问服务端时,如果两端的ip、端口、协议任意一个不同就会产生跨域。
下面介绍node.js后台如何配置允许跨域访问:
如果产生了跨域,客服端在访问服务端时,除了get请求外,其它请求都会先向客户端发送一个为 OPTIONS 的预检请求(预请求),
该请求到达服务端后,服务端会判断是否允许该请求继续访问,下面贴出我在node.js中如何配置的跨域中间件:
我是用的是express框架,在app.js中配置允许跨域(把这段代码放在你的其它中间件之前,如果对您有帮助请帮我点个赞喔(* ̄︶ ̄) ):
// 配置跨域请求中间件(服务端允许跨域请求) var allowCors = function(req, res, next) { res.header("Access-Control-Allow-Origin", req.headers.origin); // 设置允许来自哪里的跨域请求访问(req.headers.origin为当前访问来源的域名与端口) res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); // 设置允许接收的请求类型 res.header("Access-Control-Allow-Headers", "Content-Type,request-origin"); // 设置请求头中允许携带的参数 res.header("Access-Control-Allow-Credentials", "true"); // 允许客户端携带证书式访问。保持跨域请求中的Cookie。注意:此处设true时,Access-Control-Allow-Origin的值不能为 '*' res.header("Access-control-max-age", 1000); // 设置请求通过预检后多少时间内不再检验,减少预请求发送次数 next(); }; app.use(allowCors); // 使用跨域中间件