NodeJS配置CORS实现过程详解


Posted in NodeJs onDecember 02, 2020

跨域问题主要在header上下功夫

首先提供一个w3c的header定义 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

再提供一个网友提供的header详解 http://kb.cnblogs.com/page/92320/

这两个有助于帮助大家理解header的类型和作用, 但是遗憾的是跨域相关的两个header属性我都没有找到相关的定义,

下面直接告诉大家 1是Access-Control-Allow-Origin 允许的域 2是Access-Control-Allow-Headers 允许的header类型

第一项可以直接设为* 表示任意 但是第二项不能这样写,在chrome中测试跨域发现报错, 最终的代码看起来是这个样子:

app.all('*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  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") res.send(200);/*让options请求快速返回*/
  else next();
});

另外有cors模块可以用

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

只要同时满足以下两大条件,就属于简单请求。

(1) 请求方法是以下三种方法之一:

  • HEAD
  • GET
  • POST

(2)HTTP的头信息不超出以下几种字段:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID

Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

这是为了兼容表单(form),因为历史上表单一直可以发出跨域请求。AJAX 的跨域设计就是,只要表单可以发,AJAX 就可以直接发。

凡是不同时满足上面两个条件,就属于非简单请求。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJS的url截取模块url-extract的使用实例
Nov 18 NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 #NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 #NodeJs
如何利用nodejs实现命令行游戏
Nov 24 #NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 #NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 #NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 #NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 #NodeJs
You might like
mysql时区问题
2008/03/26 PHP
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
JS前端笔试题分析
2016/12/19 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
js常见遍历操作小结
2019/06/06 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
python开启多个子进程并行运行的方法
2015/04/18 Python
python变量不能以数字打头详解
2016/07/06 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
python三方库之requests的快速上手
2019/03/04 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
青年安全生产示范岗事迹材料
2014/05/04 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书