如何解决socketio跨域请求携带cookie问题?

摘要:

由于系统需要集成到一个门户网站上,原本系统nginx和消息服务是在同一服务器上,现在系统地址改变后,导致系统每次请求都要携带一个token(验证用户信息,这个token就存在cookie中),但是cookie是无法跨域的,导致消息发送失败,如:页面地址为10.90.8.87,node地址为10.90.9.76,这时候就存在cookie跨域问题了
报错信息:

Access to XMLHttpRequest at 'aaa.com'  from origin 'bbb.com' has been blocked by CORS policy.
The value of the 'Access-Control-Allow-Origin' header in the response must *not be the wildcard '*' when the request's credentials mode is 'include'.
The credentials mode of request initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

问题分析:

遇到问题不要慌,先看报错信息,他的意思就是:bbb.com到aaa.com的请求被跨域策略所阻塞,当请求中的资格属性为包含时,响应头中的Access-Control-Allow-Origin属性值不能是所有,请求中的证书属性是由withCredentials属性所控制。
可以看一下你的请求信息,若Access-Control-Allow-Origin为*,意思就是所有请求都可以访问,为某一个具体地址就是只有这个地址可以响应

在网上有很多解决方案,包括在node服务中设置Access-Control-Allow-Origin属性为**,**为具体地址(也就是客户端的地址),或者io连接中io.setOrigins(‘客户端地址’)等,但是还是要根据你的需求来确定如何解决。
我们的消息服务一般就是先在客户端(java代码)中集成,然后部署node服务端,报错信息中说的很明白,请求中的证书属性是由withCredentials属性所控制

解决措施:

现在看你到底是否需要携带cookie?
如果需要,你就必须将你的请求地址加入node服务端的白名单中
在nodejs\node_modules\socket.io\lib中编辑index.js或者manager.js

Server.prototype.serve = function(req, res){var etag = req.headers['if-none-match'];if (etag) {if (clientVersion == etag) {debug('serve client 304');res.writeHead(304);res.end();return;}}debug('serve client source');res.setHeader('Content-Type', 'application/javascript');res.setHeader('ETag', clientVersion);//加入以下代码//设置允许跨域的客户端地址res.header("Access-Control-Allow-Origin","客户端地址");//是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回res.header("Access-Control-Allow-Credentials",true);//响应首部 Access-Control-Allow-Headers 用于 preflight request(预检请求)中,列出了将会在正式请求的 Access-Control-Expose-Headers 字段中出现的首部信息res.header("Access-Control-Allow-Headers", "X-Requested-                       With,Origin,Content-Type,Accept");  //设置是否同意这些方法来修改服务器资源
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
//代码结束res.writeHead(200);res.end(clientSource);
};

java中设置一下这个withCredentials属性不就可以了,让他在请求的收不要携带cookie,我们也不管服务端到底允许谁携带,我们就直接不携带了,具体看代码块最后方
如果不需要,就直接在请求中设置withCredentials为false

Request.prototype.create = function () {var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };// SSL options for Node.js clientopts.pfx = this.pfx;opts.key = this.key;opts.passphrase = this.passphrase;opts.cert = this.cert;opts.ca = this.ca;opts.ciphers = this.ciphers;opts.rejectUnauthorized = this.rejectUnauthorized;//这里其实就是请求var xhr = this.xhr = new XMLHttpRequest(opts);var self = this;//原本这里设置了不携带,但后边debug发现它又把属性改回去了// xhr.withCredentials = false;try {debug('xhr open %s: %s', this.method, this.uri);xhr.open(this.method, this.uri, this.async);try {if (this.extraHeaders) {xhr.setDisableHeaderCheck(true);for (var i in this.extraHeaders) {if (this.extraHeaders.hasOwnProperty(i)) {xhr.setRequestHeader(i, this.extraHeaders[i]);}}}} catch (e) {}if (this.supportsBinary) {// This has to be done after open because Firefox is stupid// http://stackoverflow.com/questions/13216903/get-binary-data-with-xmlhttprequest-in-a-firefox-extensionxhr.responseType = 'arraybuffer';}if ('POST' === this.method) {try {if (this.isBinary) {xhr.setRequestHeader('Content-type', 'application/octet-stream');} else {xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');}} catch (e) {}}// ie6 checkif ('withCredentials' in xhr) {**//这里原本是true,改为falsexhr.withCredentials = false;**//xhr.withCredentials = true;}

到此node消息即可发出

socketio跨域问题解决相关推荐

  1. ssm把图片保存到项目中_项目中的图片跨域问题解决方式

    现象 首先,在生产环境中,由于进行编辑图片时,将图片回显到ReactCrop组件中进行可裁剪编辑,然而回显时,需要将图片转化为base64的格式或者blob对象, 此时需要将图片次绘制成canvas进 ...

  2. Tomcat中的字体请求跨域问题解决

    Tomcat中的字体请求跨域问题解决 原作者地址: https://blog.csdn.net/u011974399/article/details/79990505 修改tomcat的web.xml ...

  3. django-vue-admin前端设置后台接口地址为127.0.0.1产生跨域问题解决办法

    django-vue-admin前端设置后台接口地址为127.0.0.1产生跨域问题解决办法: 不能设置成127.0.0.1,设置成节点的ip地址即可解决. 应该是脚手架本身存在问题导致的.

  4. ajax跨域问题解决(spring boot)

    ajax跨域问题解决(spring boot) 参考文章: (1)ajax跨域问题解决(spring boot) (2)https://www.cnblogs.com/cosyer/p/6589874 ...

  5. vue中axios访问Java后端跨域问题解决

    vue中axios访问Java后端跨域问题解决 参考文章: (1)vue中axios访问Java后端跨域问题解决 (2)https://www.cnblogs.com/soinve/p/9295009 ...

  6. WebSocket跨域问题解决

    WebSocket跨域问题解决 参考文章: (1)WebSocket跨域问题解决 (2)https://www.cnblogs.com/goeasycloud/p/9389360.html 备忘一下.

  7. Flak——跨域问题解决

    Flask--跨域问题解决 背景:最近在使用Flak-restful+Vue来做一个app,将Vue打包在了一个安卓的壳子里面.但是这期间出现了一个比较有意思的问题--跨域.做后端开发的兄弟应该在前后 ...

  8. 前后端分离框架跨域问题解决

    1. 跨域问题的产生 前端向后台请求,但是后台与前台不是同一个域中(域名,端口,协议任一不同就不是同一个域),那么就会产生跨域问题. 2.跨域问题解决 2.1 传统的项目那么可以直接在Filter过滤 ...

  9. Vue 跨域问题解决

    Vue 跨域问题解决 vue框架目录: ProxyTable pathRewrite:是使用proxy进行代理时,对请求路径进行重定向以匹配到正确的请求地址,其中^是正则中限定开头,则是/api为开头 ...

最新文章

  1. stm32F042 (二) 按键触发中断
  2. python paramiko 问题总结
  3. nginx web服务理论与实战
  4. 第四范式重磅发布企业级AI操作系统Sage AIOS
  5. 安装ssd后不识别网卡_断桥铝门窗安装后就完了?不!该处理的处理,该检查的还要检查...
  6. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
  7. 10秒钟搞定圆柱齿轮设计所有课题
  8. docker容器获取宿主ip地址
  9. 互联网高端社畜行话大全(表情包)
  10. 通过cv2.resize()来改变图片大小
  11. html设计个人网页导航
  12. 网站制作教程:PageAdmin建站系统在win2012上的安装
  13. CentOS7.4离线安装Openssh7.9p1
  14. 安搭Share为您推荐学理财投资必读的书籍
  15. 逻辑推理能力训练与程序调试
  16. 预处理命令不是c语言本身的组成部分,C中的预处理命令
  17. SQL Update的四种常见写法
  18. 【沙发管家】夏普电视怎么装软件?怎么才能看免费电影,电视直播?
  19. E. Cashback
  20. gc2000导出丝印和坐标_GC坐标的导出与引入

热门文章

  1. Redis的发布与订阅
  2. 大数据总线(DataHub)
  3. 中式红木装修,越中式越奢华
  4. Mac笔记本用brew下载的东西存放在哪里?如何找到usr文件夹?
  5. audio和vide多媒体新属性简介:
  6. Unity设置VS2017为编译器
  7. 如何查看vue版本号
  8. 《淘宝店铺经营管理一册通》一一1.2 优化宝贝描述,让成交量飞涨
  9. UITextView控件_文字内容居左居上
  10. 族谱管理系统(孩子兄弟存储结构)