node+socket.io+redis构建消息推送服务的跨域问题
发布于 12 年前 作者 finnishare 17830 次浏览 最后一次编辑是 8 年前

用node+socket.io+redis构建了一个消息推送服务。其他项目都通过jquery的$.getScript()方式载入服务上的socket.io.js和一个封装的api脚本message.js,然后初始化的时候传入回调函数获取消息数量及消息展示方式。

在所有标准浏览器上都没问题。不管是不是同域下。但在ie下就不行。只有在同域(我测试的时候是同ip)下是没问题的。

个人觉得是socket.io的机制,因为在ie下没有用websocket,所以产生问题。有做过类似的给点意见吗?

0906补充

我发在github socket.io 上的问题描述 v 0.99 my node server on http://192.168.1.186:6789

my web server on http://192.168.1.14:85

*router code

app.get('/api', function (req, res) {
var _userid = req.query.userid;
req.session.userid = _userid;
fs.readFile('./node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.min.js', 'utf-8', function (err, data1) {
if (err)
console.log(err);
else {
fs.readFile('./public/javascripts/message.js', 'utf-8', function (err, data2) {
if (err)
console.log(err);
else {
res.setHeader('content-type', 'application/x-javascript; charset=UTF-8');
res.end(data1 + data2);
}
});
}
});

*message.js code

var socket;
var serverHost='http://192.168.1.186';
var serverPort='6789'
$(function () {
socket = io.connect(serverHost, { port:serverPort });
socket.on('connect', function () {
console.info('socket success!');
});

*client code

$.getScript("http://192.168.1.186:6789/api?userid=1265",function(){
//notice.init({userid:_1265,getNoticeNum:IBD.util.getNoticeNum,showNotice:IBD.util.showNotice});
});

all the code can work well in firefox and chrome ,but in ie

io.set('authorization', function (hsData, accept) {
console.log(hsData.headers.cookie) // undefined 
})

hao can i solve the problem or where is the problem? thank you!

i’m so sorry my english is so poor

再次补充

在ie下,如果忽略掉hsData.headers.cookie而直接创建socket.io是没有问题的,flashsocket,xhr-polling,jsop-polling都可以通过,现在的问题就是,这种跨域的获取方式在ie下无法获取到hsData.headers.cookie,怎样才能解决.

17 回复

怎么没有人给点意见!!!!自己不停的测试发现,在ie下,我开着开发者工具(F12)运行,就可以创建socket。悲催!!!什么原因!!!

这边前端不多啊, 而且高人都不怎么逛论坛的… 记得有看到过说 IE 下要到刷新时候才有连接的… 论坛里搜了下没搜到

高人不是不逛论坛,而是很低调,绝世高手都这样

socket.io支持的浏览器范围很广,对不支持websocket的浏览器它会降级处理的. 比如说 JSONP 轮询,除非你用的是IE5 = =

JSONP是一直存在的,不过不是用来轮询,是用来做跨域处理的。

我这在所有的浏览器上都是ok的。应该是你的node服务有问题。如果不行的话你可以把socket.io这个js文件放在你的网站里部署。

我也发现了可能是引用的问题,因为socket的请求地址http://192.168.1.186:6789/socket.io/1/?t526429472在ie下第一次访问是握手失败,刷新下,就可以成功!!!!有人遇到这样的问题没有!!!!

我这在所有的浏览器上都是ok的。应该是你的node服务有问题。如果不行的话你可以把socket.io这个js文件放在你的网站里部署。

这样不不能做成服务了,其他项目要用通知还要在自己的项目中部署socket.io。我只是想完全做成服务,类似google的好多服务那种模式

``` 标记下代码吧, 看起来好糊

顶起来!

LZ 你用flashsocket怎么配置的?我怎么调都不成功啊〜望指点,多谢〜

io.configure(function () {
	io.enable('browser client minification');  // send minified client
	io.enable('browser client etag');          // apply etag caching logic based on version number
	io.enable('browser client gzip');          // gzip the file
	//io.set('log level', 1);                    // reduce logging
	//io.set("origins","*");
	io.set('transports', [                     // enable all transports (optional if you want flashsocket)
	    'websocket'
	  , 'flashsocket'
	  , 'htmlfile'
	  , 'xhr-polling'
	  , 'jsonp-polling'
	]);
	//io.set('store', new sio.RedisStore({port:config.redis.port,host:config.redis.host}));
});

我现在也在做类似的项目,站Ai向站B发请求,然后将A发过去的信息推送到B的客户端,现在还不知道咋整呢,

跨域如何调用呢

主要问题是你这个cookie跨域吧?你到底需要cookie里的什么东西呢,可不可以你自己种一个cookie到客户端用?

我是进来看解决方案的。。。结果讨论了半天还没结果。。。

回到顶部