一、关于session

session是另一种记录客户状态的机制,与cookie保存在客户端浏览器不同,session保存在服务器当中;当客户端访问服务器时,服务器会生成一个session对象,对象中保存的是key:value值,同时服务器会将key值写入到cookie中,客户端的将cookie保存到本地;当用户后续访问服务器时,会携带cookie中的key值,服务器通过key获取到对应的value值。value值中可以保存当前登录用户的信息,客户端和服务端依靠这个全局唯一的标识key来维护会话状态。因此上面的key则是全局唯一的标识。

二、使用session

2.1 安装express-session

  1. cnpm install express-session --save

2.2 引入express-session模块

  1. var session = require("express-session");

2.3 配置session

  1. app.use(session({
  2. secret: "123456",
  3. resave: false,
  4. saveUninitialized: true,
  5. rolling:true,//是否每次访问服务器要更新cookie的过期时间(更新cookie的时间其实就是延长了session的保存时间)
  6. cookie: ({
  7. maxAge: 5*60*1000, //cookie过期时间
  8. secure: false//如果设置为true只有在请求协议为https时服务才可以获取session
  9. })
  10. }))

express-session 常用参数
**

参数 作用
secret 一个 String 类型的字符串,作为服务器端生成 session 的签名。
name 返回客户端的 key 的名称,默认为 connect.sid,也可以自己设置。
resave 强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。 don’t save session if unmodified
saveUninitialized 强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就处于未初始化状态。在设定一个 cookie 前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默 认:true)。建议手动添加。
cookie 设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
rolling 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)


2.4 演示代码

  1. var express = require('express');
  2. var session = require("express-session");
  3. var app = express();
  4. app.use(session({
  5. secret: "123456",
  6. resave: false,
  7. saveUninitialized: true,
  8. rolling:true,//是否每次访问服务器要更新cookie的过期时间(更新cookie的时间其实就是延长了session的保存时间)
  9. cookie: ({
  10. maxAge: 5*60*1000, //cookie过期时间
  11. secure: false//如果设置为true只有在请求协议为https时服务才可以获取session
  12. })
  13. }))
  14. //访问该路由时,判断用户是否已登录
  15. app.get('/',function(req,res){
  16. //获取session
  17. if(req.session.username){
  18. res.send('已登录:' + req.session.username);
  19. }else{
  20. res.send("未登陆");
  21. }
  22. });
  23. app.get('/login',function(req,res){
  24. //设置session
  25. req.session.username='Smith';
  26. res.send("登陆成功!");
  27. });
  28. module.exports = app;

三、session的常用方法

  1. //销毁session
  2. req.session.destroy(function(err) { })
  3. //设置 session
  4. req.session.username='小明';
  5. //获取 session
  6. var username = req.session.username;
  7. //重新设置 cookie 的过期时间
  8. req.session.cookie.maxAge=1000;

3.1 销毁session

用销毁session的方式演示退出登录。

添加一个‘/logout’ 路由

  1. var express = require('express');
  2. var session = require("express-session");
  3. var app = express();
  4. app.use(session({
  5. secret: "123456",
  6. resave: false,
  7. saveUninitialized: true,
  8. rolling:true,//是否每次访问服务器要更新cookie的过期时间(更新cookie的时间其实就是延长了session的保存时间)
  9. cookie: ({
  10. maxAge: 5*60*1000, //cookie过期时间
  11. secure: false//如果设置为true只有在请求协议为https时服务才可以获取session
  12. })
  13. }))
  14. //访问该路由时,判断用户是否已登录
  15. app.get('/',function(req,res){
  16. //获取session
  17. if(req.session.username){
  18. res.send('已登录:' + req.session.username);
  19. }else{
  20. res.send("未登录");
  21. }
  22. });
  23. app.get('/login',function(req,res){
  24. //设置session
  25. req.session.username='Smith';
  26. res.send("登录成功!");
  27. });
  28. app.get('/logout',function(req,res){
  29. //销毁session
  30. req.session.destroy(function(err){
  31. if(err){
  32. res.send(err);
  33. }else{
  34. res.send("已退出!");
  35. }
  36. });
  37. })
  38. module.exports = app;

访问路由‘/’显示“未登录”
访问路由‘/login’显示“登录成功”
再访问路由‘/’,显示“已登录:Smith”
访问路由‘/logout’,显示“已退出!”
再访问路由‘/’,显示“未登录”