我想在我的页面(访问路径http://192.168.10.105:8080/abc或http://localhost:8080/abc)中通过socket.io去连接scoket 服务器,但是 io.connect好像有跨域的问题,不知道大家是怎么解决的呢 var chat1Socket = io.connect(‘http://192.168.10.105:9092/chat1’);//这个访问不成功,好像是跨域的问题 var chat2Socket = io.connect(‘http://127.0.0.1:9092/chat2’);//这个可以连接成功,用localhost和127.0.0.1都可以成功
不用chat1
不用chat1也不可以,主要的问题是在访问地址IP和端口上
我现在也在研究这个问题。 其实单纯的靠socket.io去访问跨域是可行的,出问题的是session,也就是cookie 你socket.io服务端 io.set(‘authorization’, function (handshakeData, callback) { /*** } 肯定有这个认证,一旦跨域,handshakeData.headers.cookie是获取的服务器域的cookie. 而express的session管理也是将cookie记录在服务端里的,只有你访问服务端域的时候,cookie才会生成,这时才有所谓的session。 app.use(session({ resave: true, saveUninitialized: true, secret: config.session_option.secret, cookie: {maxAge: 1000 * 60 * 60 * 24 * 1}, store: storeMemory })); 在你服务端没有cookie记录的时候(默认为connectsid),直接通过客户端socket.io去远程链接是生成不了cookie的,同时也就获取不到,在认证这块就出了问题,所以就走不通。
@hliu2008 前面放个ngnix做反向代理,把Web服务器和WebSocket服务器映射到同一个域。这样行不?
@bnuhero 如果 3楼 是正确的话,那做了反向代理也还是没解决 cookie 的问题吧
@bnuhero 不行,这不是跨域的问题,而且必须得访问一个服务端的页面让他生成cookie使node的session生效才可以。 我目前暂时是通过隐藏一个iframe去访问一个服务端的空白页面,用来生成cookie里的connectsid值。虽然方法笨了点
还是找不到好的方案,
@penweizgx 我就是这样做了的,你所说的不行,应该是别的原因,你要么贴出来,要么自己查。 socket.io连接远程,IP+端口就行,如果要分namespace,后面就路径就是。
@captainblue2013 我用的这个demo https://github.com/mrniko/netty-socketio-demo ,后端是java开发的,原理应该和node 的soket.io的后台差不多
@penweizgx 那我就不知道了,我用的node,前后端都是socket.io
有好的方案吗?我也遇到socket远程跨域这个问题了