Express 全系列教程之 (八):session 的基本使用 一, 关于 session
session 是另一种记录客户状态的机制, 与 cookie 保存在客户端浏览器不同, session 保存在服务器当中;
二, 设置 session
我们使用 express-session 模块来设置 session
1. 安装 express-session
cnpm install express-session --save
2. 引入 express-session 模块
const session=require("express-session");
3. 设置 session
session(options);
如下列代码:
- const express=require("express");
- const session=require("express-session");
- var App=express();
- // 配置中间件
- App.use(session({
- secret: "keyboard cat",
- resave: false,
- saveUninitialized: true,
- cookie: ('name', 'value',{maxAge: 5*60*1000,secure: false})
- }));
- App.use('/login',function(req,res){
- // 设置 session
- req.session.userinfo='张三';
- res.send("登陆成功!");
- });
- App.use('/',function(req,res){
- // 获取 session
- if(req.session.userinfo){
- res.send("hello"+req.session.userinfo+",welcome");
- }else{
- res.send("未登陆");
- }
- });
- App.listen(8080);
在 session(option) 中对 session 进行设置, 它的主要参数是:
1. name - cookie 的名字 (原属性名为 key).(默认:'connect.sid')
2. store - session 存储实例
3. secret - 用它来对 session cookie 签名, 防止篡改
4. cookie - session cookie 设置 (默认:{ path: '/', httpOnly: true,secure: false, maxAge: null })
5. genid - 生成新 session ID 的函数 (默认使用 uid2 库)
6. rolling - 在每次请求时强行设置 cookie, 这将重置 cookie 过期时间 (默认: false)
7. resave - 强制保存 session 即使它并没有变化 (默认: true, 建议设为: false)
8. proxy - 当设置了 secure cookies(通过 "x-forwarded-proto" header ) 时信任反向代理. 当设定为 true 时,
"x-forwarded-proto" header 将被使用. 当设定为 false 时, 所有 headers 将被忽略. 当该属性没有被设定时, 将使用 Express 的 trust proxy.
9. saveUninitialized - 强制将未初始化的 session 存储. 当新建了一个 session 且未设定属性或值时, 它就处于未初始化状态. 在设定一个 cookie 前, 这对于登陆验证, 减轻服务端存储压力, 权限控制是有帮助的.(默认: true)
10. unset - 控制 req.session 是否取消 (例如通过 delete, 或者将它的值设置为 null). 这可以使 session 保持存储状态但忽略修改或删除的请求 (默认: keep)
三, session 的常用方法
- req.session.username="张三"
- // 获取 session
- req.session.username
- // 重新设置 cookie 的过期时间
- req.session.cookie.maxAge=1000;
- // 销毁 session
- req.session.destroy(function(err){
- })
以下演示通过销毁 session 的方式来退出登录:
- const express=require("express");
- const session=require("express-session");
- var App=express();
- // 配置中间件
- App.use(session({
- secret: "keyboard cat",
- resave: false,
- saveUninitialized: true,
- cookie: ('name', 'value',{ maxAge: 5*60*1000,
- secure: false,
- name: "seName",
- resave: false})
- }));
- App.use('/login',function(req,res){
- // 设置 session
- req.session.userinfo='张三';
- res.send("登陆成功!");
- });
- App.use('/loginOut',function(req,res){
- // 注销 session
- req.session.destroy(function(err){
- res.send("退出登录!"+err);
- });
- });
- App.use('/',function(req,res){
- // 获取 session
- if(req.session.userinfo){
- res.send("hello"+req.session.userinfo+",welcome to index");
- }else{
- res.send("未登陆");
- }
- });
- App.listen(8080);
当我们进入到主页时, 未显示任何信息, 进入 login 路由后, 自动设置 session, 这是回到主页则显示 session 信息, 之后进入 loginOut 路由已注销 session 信息, 再回到首页显示为登陆.
来源: https://www.2cto.com/kf/201904/806067.html