React + Express 在Chrome中Post的Session重置问题

       测试登录的过程中,发现在Safari中用户登陆可以一次成功,在redis中session还是原来的;当时在Chrome浏览器中,用户登录后,redis中的session被重写了一遍。后续在页面中获取到cookie后,session是原来的,不是被重置后的session。导致无法获取到系统设置的session,系统出现各种问题。

1. 查看cookie设置问题

       在这个过程中,发现前后session不一致,session被重置过程中,是不是cookie的设置有问题。首先看了chrome的 path 的设置的问题,修改代码发现没有解决问题。

       在express-session的设置中, 以前的两个值都是true,轮换修改为false反复测试,发现依然不能解决问题。

resave: true,  
saveUninitialized: true  
2. Debug express-session

启动应用的时候:

DEBUG=express-session node server.js  

系统中打印的日志:

Safiri

express-session fetching VENaD0LYaPcxY89gzleDEnkTbqlimWrF +6s  
express-session session found +1ms  
info: req.session.id is :  
info: VENaD0LYaPcxY89gzleDEnkTbqlimWrF  
express-session saving VENaD0LYaPcxY89gzleDEnkTbqlimWrF +74ms  
express-session split response +0ms  

Chrome

express-session no SID sent, generating session +7s  
info: req.session.id is :  
info: 9B04UA9Jz-XS8ZUthOtmJ-LM3x8R6skl  
express-session saving 9B04UA9Jz-XS8ZUthOtmJ-LM3x8R6skl +38ms  
express-session split response +1ms  
express-session set-cookie uuChat.cid=s%3A9B04UA9Jz-XS8ZUthOtmJ-LM3x8R6skl.ozRE5WJh1NtDOodT1Kwfox957%2F37P7aLBMRU4Hwp390; Path=/; HttpOnly +0ms  

通过日志分析发现Chrome浏览器重新生成了session,查看express-session源码,找到一下代码:

if (!req.sessionID) {  
      debug('no SID sent, generating session');
      generate();
      next();
      return;
}

猜测是没有读取到cookie造成的问题。

3. 添加Cookie的info

我们在express的请求代码中添加日志:

winston.info(req.signedCookies[nconf.get('sessionKey')]);  

在打印的日志中发现,Safari中有cookie的信息,而在Chrome浏览器中没有相关的信息。所以查看一下react的代码,看看是不是Post数据的是否没有设置cookie。

4. 问题的解决

前端Post代码中添加带上cookie的属性:

credentials: 'include',


参考资料