Express Session 的基本使用

一、 Session 简单介绍

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。

Cookie 数据存放在客户的浏览器上,Session 数据放在服务器上。Session 相比 Cookie 要 更安全一些。由于 Session 保存到服务器上,所以当访问量增多的时候,会比较占用服务器 的性能。单个 cookie 保存的数据大小不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。Session 没有这方面的限制。Session 是基于 Cookie 进行工作的。

二、 Session 的工作流程

当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生成一 个类似于 key,value 的键值对, 然后将 key(cookie)返回到浏览器(客户)端,浏览器下次 再访问时,携带 key(cookie),找到对应的 session(value)。

三、 express-session 的使用

https://www.npmjs.com/package/express-session

1、安装 express-session

cnpm install express-session --save 

2、引入 express-session

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

3、 设置官方文档提供的中间件

app.use(session({ secret: 'keyboard cat', resave: true, saveUninitialized: true })) 

4、使用
设置值

req.session.username = "张三"; 

获取值

req.session.username

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、 express-session 的常用参数

app.use(session({ 
	secret: '12345', 
	name: 'name', 
	cookie: {maxAge: 60000}, 
	resave: false, 
	saveUninitialized: true 
}));

在这里插入图片描述
在这里插入图片描述

五、 express-session 的常用方法

req.session.destroy(function(err) { /*销毁 session*/ })
req.session.username='张三'; //设置 session 
req.session.username //获取 session 
req.session.cookie.maxAge=0; //重新设置 cookie 的过期时间,它会销毁所有的session

在这里插入图片描述

在这里插入图片描述

const express = require("express")
const ejs = require("ejs")
const bodyParser = require("body-parser")
const cookieParser = require('cookie-parser')
const session = require('express-session')
const app = new express()
// 配置模板引擎
app.engine("html", ejs.__express)
app.set("view engine", "html")
// 配置静态web目录
app.use(express.static("static"))

// 配置第三方中间件
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
// 配置cookieParser中间件
app.use(cookieParser("zep"))
// 配置session的中间件
app.use(session({
  secret: 'keyboard cat', // 服务器端生成session的签名
  name: "sessionName", // 修改session对应的cookie的名称
  resave: false, // 强制保存 session ,即使它并没有变化
  saveUninitialized: true, // 强制将未初始化的session存储
  cookie: { 
      maxAge: 1000*60, // 设置过期时间为一分钟
      secure: false // true 表示只有https协议才能访问cookie
    },
    rolling: true // 在每次请求时强行设置cookie,这将重置cookie的过期时间(默认值为false)
}))
app.get("/book", (req, res)=> {
    // 设置session
    req.session.username = "张三三"
    res.send("book页面")
})
app.get("/getbook", (req, res)=> {
    // 获取session
    if(req.session.username) {
        res.send(req.session.username + "-已登录")
    } else {
        res.send("没有登录")
    }  
})

app.get("/", (req, res)=> {
    // 设置cookie 如果cookie没有过期的话,关闭浏览器后重新打开,cookie仍然还在,不会被销毁
    res.cookie("username", "张三", {
        maxAge: 1000*60*60,
        signed: true
    })
    res.send("首页")
})

app.get("/article", (req, res) => {
    // 获取cookie
    let username = req.cookies.username
    console.log(username)
    res.send("新闻页面--" + username)
})

app.get("/user", (req, res) => {
    // 获取加密的cookie
    let username = req.signedCookies.username
    res.send("用户页面--" + username)
})

app.get("/login", (req, res)=> {
    // 设置session
    req.session.username = "张三啊"
    res.send("执行登录")
})

app.get("/loginOut", (req, res)=> {
    // 1.设置session的过期时间为0
    //req.session.cookie.maxAge = 0

    // 2.销毁指定的session
    //req.session.username = ""

    // 3.销毁所有的session
    req.session.destroy()
    res.send("退出登录")
})


app.post("/doLogin", (req, res)=> {
    var body = req.body
    console.log(body)
    res.send("执行提交")
})




app.listen(3000)

六、 负载均衡配置 Session,把 Session 保存到数据库里面

  1. 需要安装 express-session 和 connect-mongo 模块
  2. 引入模块
const session = require("express-session"); 
const MongoStore = require('connect-mongo');
  1. 配置中间件
// 配置session的中间件
app.use(session({
  secret: 'keyboard cat', // 服务器端生成session的签名
  name: "sessionName", // 修改session对应的cookie的名称
  resave: false, // 强制保存 session ,即使它并没有变化
  saveUninitialized: true, // 强制将未初始化的session存储
  cookie: { 
      maxAge: 1000*60, // 设置过期时间为一分钟
      secure: false // true 表示只有https协议才能访问cookie
    },
    rolling: true, // 在每次请求时强行设置cookie,这将重置cookie的过期时间(默认值为false)
    store: MongoStore.create({
        mongoUrl: 'mongodb://admin:admin@localhost/itying?authSource=admin&w=1',
        // mongoOptions: advancedOptions ,
        touchAfter: 24 * 3600 // 不管发出了多少请求,在24小时内,只更新一次session,除非你改变了这个session
      })
}))

在这里插入图片描述

在这里插入图片描述

const express = require("express")
const ejs = require("ejs")
const bodyParser = require("body-parser")
const cookieParser = require('cookie-parser')
const session = require('express-session')
const MongoStore = require('connect-mongo');

const app = new express()
// 配置模板引擎
app.engine("html", ejs.__express)
app.set("view engine", "html")
// 配置静态web目录
app.use(express.static("static"))

// 配置第三方中间件
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
// 配置cookieParser中间件
app.use(cookieParser("zep"))
// 配置session的中间件
app.use(session({
  secret: 'keyboard cat', // 服务器端生成session的签名
  name: "sessionName", // 修改session对应的cookie的名称
  resave: false, // 强制保存 session ,即使它并没有变化
  saveUninitialized: true, // 强制将未初始化的session存储
  cookie: { 
      maxAge: 1000*60, // 设置过期时间为一分钟
      secure: false // true 表示只有https协议才能访问cookie
    },
    rolling: true, // 在每次请求时强行设置cookie,这将重置cookie的过期时间(默认值为false)
    store: MongoStore.create({
        mongoUrl: 'mongodb://admin:admin@localhost/itying?authSource=admin&w=1',
        // mongoOptions: advancedOptions ,
        touchAfter: 24 * 3600 // 不管发出了多少请求,在24小时内,只更新一次session,除非你改变了这个session
      })
}))
app.get("/book", (req, res)=> {
    // 设置session
    req.session.username = "张三三"
    res.send("book页面")
})
app.get("/getbook", (req, res)=> {
    // 获取session
    if(req.session.username) {
        res.send(req.session.username + "-已登录")
    } else {
        res.send("没有登录")
    }  
})

app.get("/", (req, res)=> {
    // 设置cookie 如果cookie没有过期的话,关闭浏览器后重新打开,cookie仍然还在,不会被销毁
    res.cookie("username", "张三", {
        maxAge: 1000*60*60,
        signed: true
    })
    res.send("首页")
})

app.get("/article", (req, res) => {
    // 获取cookie
    let username = req.cookies.username
    console.log(username)
    res.send("新闻页面--" + username)
})

app.get("/user", (req, res) => {
    // 获取加密的cookie
    let username = req.signedCookies.username
    res.send("用户页面--" + username)
})

app.get("/login", (req, res)=> {
    // 设置session
    req.session.username = "张三啊"
    res.send("执行登录")
})

app.get("/loginOut", (req, res)=> {
    // 1.设置session的过期时间为0
    //req.session.cookie.maxAge = 0

    // 2.销毁指定的session
    //req.session.username = ""

    // 3.销毁所有的session
    req.session.destroy()
    res.send("退出登录")
})


app.post("/doLogin", (req, res)=> {
    var body = req.body
    console.log(body)
    res.send("执行提交")
})




app.listen(3000)
  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,针对你的问题:Express 框架中的 session,我可以给你讲解一下。 在 Web 应用中,session 是一种在服务器端存储数据的机制。它允许我们在不同的页面或请求之间共享数据,以实现用户身份验证、购物车、表单填写等功能。 在 Express 框架中,我们可以使用第三方中间件 `express-session` 来实现 session 的功能。具体的实现步骤如下: 1. 安装 `express-session` 中间件: ``` npm install express-session ``` 2. 引入中间件并设置: ```javascript const session = require('express-session'); app.use(session({ secret: 'your secret key', resave: false, saveUninitialized: true })); ``` 这里的 `secret` 参数是用于指定一个秘密字符串,用于加密 session 数据。`resave` 和 `saveUninitialized` 参数分别表示每次请求结束后是否强制保存 session 数据和在没有数据的情况下是否保存一个空的 session 对象。 3. 在路由中使用 session: ```javascript app.get('/login', (req, res) => { req.session.username = 'user1'; res.send('Login success.'); }); app.get('/profile', (req, res) => { const username = req.session.username; if (username) { res.send(`Welcome, ${username}.`); } else { res.send('Please login first.'); } }); ``` 在上面的示例中,我们在 `/login` 路由中设置了 session 的 `username` 属性,然后在 `/profile` 路由中读取了该属性,并根据其值显示不同的信息。 以上就是使用 `express-session` 实现 session 功能的基本步骤。希望能对你有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值