如何删除cookie-session?为何req.session={}无效而req.session=null有效?
为什么
req.session = {}无法删除session,而req.session = null可以? 你的代码示例:
var express = require('express') var sessionCookie = require('cookie-session') var app = express(); app.use(sessionCookie({ keys: ['abc'], name: 'user' })); app.get('/', function (req, res, next) { req.session.views = (req.session.views || 0) + 1; res.end(JSON.stringify(req.session)); console.log('req.session', req.session); }); app.get('/logout', (req, res) => { req.session = {}; // req.session = null; console.log("req.session(logOut): ", req.session); res.redirect('/'); }); app.listen(3000);
原因解析:
你使用的cookie-session中间件核心逻辑是把session数据直接存在客户端的Cookie里,而非服务器端存储,这是理解问题的关键:
- 当执行
req.session = null时,cookie-session会识别这个特殊值,自动在响应头里添加Set-Cookie指令,将对应的session Cookie设置为过期状态。客户端收到响应后会删除该Cookie,session也就被彻底清除了。 - 当执行
req.session = {}时,中间件会把这个空对象序列化后写入Cookie。客户端依然会保留这个Cookie,只是里面的session数据为空。下次请求时,中间件会把空Cookie解析为req.session = {},看起来session还“存在”(Cookie没被删除),只是没有有效数据,并没有真正清除session。
如果想通过赋值空对象的方式彻底删除session,需要手动清除对应的Cookie:
app.get('/logout', (req, res) => { req.session = {}; res.clearCookie('user'); // 'user'是你配置的session name res.redirect('/'); });
内容的提问来源于stack exchange,提问作者Hojat
相关产品推荐
相关产品推荐

