}
});
app.get('/logout',(request, response)=>{
const userId = request.session.userId;
request.session.destroy((err)=>{
if(err || !userDb.has(userId)){
response.send('登出失败');
}else{
userDb.delete(userId);
response.send('登出成功');
}
});
});
app.get('/',(request, response)=>{
if(request.session.userId && userDb.has(request.session.userId)){
response.send(`欢迎回来${userDb.get(request.session.userId)}`);
}else{
response.send('还未登录');
}
});
app.use((request, response) => {
response.send('404 not found');
});
app.listen(8888, '127.0.0.1');
在浏览器中依次输入以下url来模拟登录行为:
localhost:8888/
localhost:8888/login?id=ASCll&pwd=123456
localhost:8888/
localhost:8888/logout
localhost:8888/暗坑
我在chrome浏览器下运行上面的例子多次后发现一个问题,浏览器会进行预读取网页来提高性能,也就是说在浏览器中当我url输入到如下的地方时:
localhost:8888/logo根据我之间多次进入这个页面浏览器会提前访问这个页面
localhost:8888/logout,而导致服务器直接删除
session等到真正进入到页面的时候已经是第二次加载页面了,导致每次登出都显示失败.希望有经验的朋友能给出一个合理的解决方案.
注意
当
express-session和
cookie-parser一起使用的时候对于
cookie的签名必须一致.
express-session的存储实例是可以更换的,默认使用
MemoryStore只适合于测试和开发使用,生产环境必须要使用其他的储存实例,否则会出现内存碎片问题,在官方文档中给出了已经实现的接口,可以对接
redis以及
mongodb等数据库.该列表在官方文档的最后:
npm地址









