session
2019-01-07 本文已影响7人
这是这时
Session
会话保持的机制,session 是记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。
session 的使用
-
第三方模块 express-session
-
配置
// app.js const session = require('express-session'); app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60*60*24*1000 }, resave: false, saveUninitialized: true, }));
- name: 设置 cookie 中,保存 session 的字段名称,默认为 connect.sid 。
- secret: 这个 string 对 sessionID 对应的cookie进行签名,并放在 cookie 中。
- cookie: 设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: '/’, httpOnly: true, maxAge: null })
- resave: 强制session保存到session store中。即使在请求中这个session没有被修改。
- saveUninitialized: 强制没有“初始化”的session保存到storage中,没有初始化的session指的是:刚被创建没有被修改(第一次请求是否生成 sessionid)
-
使用
// req.session 是一个对象 // 当配置好 session 之后,可以使用 session 保持登录的状态 req.session.user = user; // 在其他路由,可以判断登录的状态 if (!req.session.user) { // 如果状态不存在则没有登录 } // 退出的时候要,销毁session req.session.destroy()
session的原理
- 浏览器向服务器发送登录请求(post),携带账号和密码
- 登录成功,服务器记录登录的状态,req.session.user = user; 服务器记录这些信息
- 服务器返回的响应头中携带 服务器生成的 sessionid(cookie中),身份标示
- 浏览器再次访问服务器的时候会通过cookie携带sessionid
- 服务器获取浏览器发送的sessionid后,在服务器查找sessionid,如果找不到,未登录
- 如果找到 sessionid,根据 sessionid 查找对应的对象,登录成功
Cookie 和 Session 的区别
- cookie 数据存放在客户端,session 数据放在服务器端。
- cookie 不是很安全,别人可以分析存放在本地的cookie 并进行 cookie 欺骗 考虑到安全应当使用session。
- session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用 cookie 。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 将登陆信息等重要信息存放为 session、其他信息如果需要保留,可以放在cookie中