【问题标题】:Change cookie expiration in Express在 Express 中更改 cookie 过期时间
【发布时间】:2012-12-12 12:36:47
【问题描述】:

因为我在调用expressServer.use(express.session({params})) 时没有定义 maxAge,所以 cookie 的过期时间设置为“Session”。

我想在登录时添加“记住我”功能。如果选择“记住我”,有效期将延长到一个月。

我该怎么做呢?我尝试简单地扩展 maxAge,但这似乎没有做任何事情......

expressServer.get '/blah', (request, response) =>
    request.session.cookie.maxAge = 2592000
    response.end 'hello there'

感谢您的帮助!

** 编辑 **

我尝试制作一个简单的服务器来测试更新用户的 cookie。我正在使用 Express 3.0.4

当我访问 127.0.0.1:9000/blah 时,浏览器 cookie 的“expires”字段仍然是“session”...

express = require 'express'

expressServer = express()
expressServer.use express.cookieParser()
expressServer.use express.session
    secret: 'supersecret'
    cookie:
        path: '/'
        httpOnly: true

expressServer.get '/', (request, response) =>
    response.end 'hello'

expressServer.get '/blah', (request, response) =>
    request.session.cookie.maxAge = 3600000
    response.end 'hello again'

expressServer.listen 9000
console.log 'server running'

咕噜咕噜……

【问题讨论】:

  • 但是,如果我清除浏览器 cookie 并访问“/blah”,则“过期”字段设置正确。这是有道理的,因为需要第一次设置 cookie :)
  • 好的...它似乎只有在我更新会话时才有效...所以我刚刚添加了request.session.blah = Date() 并且事情神奇地起作用了?
  • 您可以尝试set the maxAge with a default value,如果未选中复选框(req.session.cookie.expires = false),则使 cookie 过期。
  • 有区别吗? @_@

标签: node.js session cookies express connect


【解决方案1】:

我在 /login 页面上有一个复选框,上面写着“记住我”:

<p class="remember">
  <input type="checkbox" id="remember" name="remember" value="1" />
  <label for="remember">Remember me</label>
</p>

然后在我到 /login 的 POST 路由中,如果设置了 req.body.remember,我会进行一些健全性检查并设置会话,否则它只是一个窗口会话:

  //user is authenticated
  //set session length
  if ( req.body.remember ) {
    var hour = 3600000;
    req.session.cookie.maxAge = 14 * 24 * hour; //2 weeks
  } else {
    req.session.cookie.expires = false;
  }

  req.session.userid = user._id;

在app.js中添加以下几行(我用redis):

  app.use(express.cookieParser('secret-word'));
  app.use(express.session({
    store: new RedisStore({
      host: cfg.redis.host,
      db: cfg.redis.db
    }),
    secret: 'another-secret'
  }));

【讨论】:

  • 对我来说,它改变了后端会话的cookie,但实际上并没有改变浏览器中的任何东西:'(
  • 我更新了答案。我正在使用 redis,这就是我需要做的所有事情。
【解决方案2】:

如果要在 express 4 中使用cookie-sessions 实现滚动会话,请像这样配置中间件:

app.use(cookieSession({
    secret: your_secret,
    maxAge: your_maxAge,
    key: 'sessionId'
}));

请注意,您不需要设置expires 选项。

为了延长你的会话,只需像这样改变它:

app.get('*', function (req, res, next) {
    req.session.foobar = Date.now();
    next();
}

请注意,在 express 4 中没有req.session.touch()

【讨论】:

    【解决方案3】:

    将 cookie 名称设置为 value,其中可能是转换为 JSON 的字符串或对象。路径选项默认为"/"

    res.cookie('rememberme', '1', 
                    { expires: new Date(Date.now() + 900000), httpOnly: true });
    

    可以使用以下链接的更多参考资料

    http://expressjs.com/api.html#res.cookie

    【讨论】:

      【解决方案4】:

      我找到了一个似乎对我有用的answer;将其添加到您的路线顶部。

      app.all '*', (req,res,next) ->
        if req.method is 'HEAD' or req.method is 'OPTIONS'  
          next()
        else
          req.session._garbage = Date();
          req.session.touch();
          next();
      

      【讨论】:

        【解决方案5】:

        或者你可以试试这个,它对我有用:

        if ( req.body.remember ) 
        {
            var oneWeek = 7 * 24 * 3600 * 1000; //1 weeks                    
            req.session.cookie.expires = new Date(Date.now() + oneWeek);
            req.session.cookie.maxAge = oneWeek; 
        }
        

        【讨论】:

          猜你喜欢
          • 2015-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-03
          • 2013-12-26
          • 1970-01-01
          • 2012-03-06
          相关资源
          最近更新 更多