困扰我十天的问题,求大家帮帮忙,可能是关于EXPRESS SESSION跨域的问题
发布于 9 年前 作者 clg1991 5837 次浏览 最后一次编辑是 8 年前 来自 问答

本人是一个初学菜鸟,主要是学PHP的,自己在做一个网站,接触到SOCKET IO。 一些专业词汇不太会用啊,希望大家能明白我问的意思。。。 在GITHUB上下载了一个 一对一聊天的代码,https://github.com/xyc-cn/socket-angular/tree/xyc_4 地址这里。这个程序用到了NODEJS ANGULAR JS SOCKET IO。

想把这个一对一聊天的程序嵌入我的网站,这个程序的端口是8000,我的网站的端口是38.我的方法就是把现在的代码里STATIC/INDEX.HTML里的代码 复制到我的WAMP服务器38端口的INDEX文件里。 当然,里面的那些指向8000端口的URL,我都加上了http://127.0.0.1:38/chat4/public/。
比如 原来的文件里的
<script type=“text/javascript” src="/socket.io/socket.io.js"></script> 改成了 <script type=“text/javascript” src=“http://127.0.0.1:8000/socket.io/socket.io.js”></script>

然后出现了一些问题,先是无法接受到CONNECT.SID。 网页COOKIE里 没有CONNECT.SID。 我就用一个隐藏的IFRAM载入了8000端口,38端口的页面里就又COOKIE CONNECT.SID了。。。话说,有没有大师,非常了解这个connect.sid到底是什么东西。。

虽然能接受到CONNECT.SID,但是我发现登录的时候,EXPRESS SESSION又新建了一个SESSION,存入USER信息,而不是存入之前载入页面的时候创建的SESSION里。

这是USER.JS文件里的登录段的代码,

router.post(’/login’, function(req, res) { var account = req.body.account; var password = req.body.password; UserModel.modify({account:account,password:password},{status:1},function(err,doc){ if(err!=null){ res.status(500).end(JSON.stringify(err)); } else{ if(doc){ doc.password = undefined;

      req.session.user = doc;
      res.end(JSON.stringify(doc));
    }
  else{
      res.status(401).end("密码错误");}
  }

});

问题好像就出现在req.session.user=doc ,而且可能是跨域的问题。。 如果我直接在8000端口进入这个程序,每次进入页面会在MONGODB(程序作者用MONGODB 存SESSION)中生成一个session,然后登录的时候,会在这个SESSION里 存入USER信息。 而我把程序嵌入我的网站后,进入网站后生成SESSION,登陆后又重新生成一个SESSION,并且USER信息被存入这个新SESSION里。。

搜狗截图16年01月24日1546_1.jpg 这是嵌入我的网站后,SESSION生成了两次,第一次是载入页面,第二次是登录,ID不一样。

搜狗截图16年01月24日1549_2.jpg 这是正常的从8000端口进入这个聊天程序,载入页面的时候生成一次,登录的时候只是在原有的SESSION里加入了USER,SESSION的ID一样。

是不是我把这个程序嵌入自己网站的方法就不对啊? 还是这个EXPRESS SESSION在跨域的时候出现了问题? 求大神指导啊,到底怎么才能把 这个程序正常的在我的网站里运行呀。 我感觉是出现在登录段代码的req.session.user上。但是不知道该怎么继续往下寻找问题的根源了。。

11 回复

有没有人呀。。求解答啊。。这个问题对我来说真的太难了

@clg1991 代码中显示, 只有登录才会去存储session, 所以, 你看你在哪里登录了, 而且登录后不能再次登录, 这样就不会去存两次session了

@zkaip 不是这个意思,正常情况下 ,只要进入页面EXPRESS SESSION就会生成一个SESSION,然后登录的时候去寻找这个SESSION并加入USER数据。 而我把它放进我的网站,端口不一致的情况下,登录的时候无法找到之前的SESSION。。。然后又新建了一个。 我现在不知道 怎么才能让它正确找到之前的SESSION啊。。好想是跨域的情况让它找不到了。。

端口不同,非同源。

试试用redis来存 redis-session

解决一下 跨域cookie的问题 应该就可以解决了

想要跨站登录需要:res.set('Access-Control-Allow-Origin','http://domain:port');

楼主,我遇到也是session问题,但是和你的不一样,我的是所有get请求都能遇到session,但是前端使用ajax请求,后台获取不到session值,迷惑中。。。。

@tongwangyuan ajax 是否头部是否将认证设置为true ? 看下req里面是否携带了cookie

逻辑应该是只要载入网站就自动生成一个sessionid,登陆后就在session里增加账户信息表示登陆成功。 ··· if(err!=null){ res.status(500).end(JSON.stringify(err)); } else{ if(doc){ ··· 这段代码的意思不就是mongodb报错了才会新生成一个session,所以应该是登录页和首页的cookie不共享造成的,登录页的cookie里没有sessionid。

@febobo 谢谢,搞定了,是因为get请求用了localhost。而ajax用了127.0.0.1;没仔细看。。。

回到顶部