【问题标题】:node sessions not clearing in production节点会话未在生产中清除
【发布时间】:2017-06-13 13:52:06
【问题描述】:

我正在使用 node 和 express 的客户端会话,但在注销用户时遇到问题。

我的注销功能做了一个

req.session.user=null 

即:

userRouter.get('/logout', function(req, res, next) {
  req.session.user = null
res.sendStatus(200)
});

(我也尝试过删除 req.user、req.user.destroy() 和其他变体)。

在本地主机上的开发环境中,它工作得很好。 生产环境中,调用logout,但是下次用户在浏览器上刷新页面时,用户仍然处于登录状态。

开发和生产中的代码相同。

有人知道吗? 谢谢....

【问题讨论】:

    标签: node.js session


    【解决方案1】:

    根据this blog post上的client-sessions,你可以这样使用:

    userRouter.get('/logout', function(req, res, next) {
      req.session.reset(); 
      res.sendStatus(200);
    });
    

    【讨论】:

    • 感谢@robertklep,我试过了,但没有运气。有趣的是,代码在 localhost 中就像一个魅力。另外,在服务器上我可以看到会话,我可以将它设置为空,但是当用户刷新时,它就像它仍然存在......
    • 您可能应该查看浏览器开发工具中的请求/响应周期,以了解重置 cookie 时会发生什么。此外,您的生产环境是仅包含一台服务器,还是不止一台?
    • 只有一个服务器(我的意思是,一个服务于客户端,一个用于 API)
    • 哪台服务器正在处理会话?您是否尝试过从单个 (HTTP) 服务器同时提供这两种服务?
    • 是的,同一台服务器。我在同一个文件中有三个函数,都获取 http 请求和所有处理会话。其中两个可以读写。神奇地,注销一个可以读取,但写入不会影响会话。可能是因为竞争条件(客户端同时使用同一会话发出其他请求?)
    【解决方案2】:

    所以问题是我没有

    headers: {
                'Accept': 'application/json',
            },
    

    在来自客户端的调用中。我对此有点困惑,似乎只有当客户端具有此标头时,服务器才会设置会话(通过 nginx),而在 localhost 中,它在没有此标头的情况下正确设置会话。

    【讨论】:

    • 您是否在 NGINX 中缓存代理响应?
    • 真正的答案是我不知道...我有这个指令 proxy_cache_bypass $http_upgrade;
    • 我认为 NGINX 不会自动缓存代理响应,所以除非您明确配置它,否则它可能不会缓存。
    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多