JWT状态保持

本文介绍了状态保持的概念,对比了session和JWT。详细讲解了JWT的工作原理、数据结构、特点及其实现代码,包括Header、Payload和Signature部分。还讨论了JWT解决跨域认证问题的能力,以及JWT在状态保持中的优势和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态保持

  • 状态保持的概念
  • session
  • JWT

状态保持的概念

所谓状态保持,就是指保存用户的登陆状态。用户在一定时间内,如果再次打开网站,那么就不需要再次登陆。因为登陆的状态已经在上一次登陆中被保存下来了,但是,这个状态的保存不是永久的,一般会有一个时间。

最早的时候,要实现状态的保持,最常见的就是:

  • cookie:所谓 cookie,是将用户的信息保存在客户端,下一次用户再访问网站的时候,会自动携带 cookie 到服务器端。
  • session:将用户的数据存储在服务器端,客户端返回一个 sessionID,下一次用户再次访问该网站的时候,会自动携带 sessionID 到服务器,服务器根据这个 sessionID 来找到对应的用户的数据。

session

session 是用于记录用户登录状态的一种机制。不同于 cookie,session 的数据是保存在服务器端,然后往客户端返回一个 sessionID。下一次请求的时候,会带上这个 sessionID,从而从服务器中找到对应的数据。

session 具体示例如下:

这里我们会使用到 express-session 这个中间件,该中间件有一些常见的配置:

name: 默认'connect.sid',可自定义。
store: session 储存器实例。
secret: 用于对 cookie 进行签名 ,通过它可以判断出客户是否修改了 cookie,这是处于安全考虑,这个参数是任意字符串。
cookie: 对 session cookie 的设置 。默认值'{ path: '/', httpOnly: true, secure: false, maxAge: null }'。
genid: 是个函数,调用它来生成一个新的会话ID。(默认:使用UID2库)。
rolling: 强制对每个响应的 Cookie,重置到期日期。(默认:false)。
resave: 每一次都重新保存,即使没修改过(默认:true)。
proxy: ture/false,是否支持 trust proxy,,需要设置'app.enable("trust proxy")'。一般来说,无需设置。

session 对象常用方法如下:

session.destroy(): 删除 session,当检测到客户端关闭时调用。
session.reload(): 当 session 有修改时,刷新 session。
session.regenerate(): 将已有 session 初始化。
session.save(): 保存 session。

示例代码如下:

const express = require('express');
const app = express();
const session = require('express-session');
const cookieParser = require('cookie-parser')

//中间件使用session
app.use(session({
   
    // 参数配置
    secret: 'luckystar', // 加密字符串
    name: 'userid', // 返回客户端 key 的名称,默认为 connect_sid
    resave: false, // 强制保存session,即使它没有变化
    // 强制将未初始化的 session 存储。当新建一个 session 且未设定属性或值时,它就处于未初始化状态。
    // 在设定 cookie 前,这对于登录验证,减轻服务器存储压力,权限控制是有帮助的,默认为 true
    saveUninitialized: true, // 保存未初始化的 session,即使没有用到 session,也会产生 session 并且保存
    cookie: {
   
        maxAge: 50000
    },
    rolling: true, // 在每次请求时进行设置 cookie,将重置 cookie 过期时间
    // 将 session数据存储到 mongo 数据库中
    // store:new mongoStore({
   
    //  url:'mongodb://127.0.0.1/admin', // 数据库地址
    //  touchAfter:24*3600  // 多长时间往数据库中更新存储一次,除了在会话数据上更改了某些数据除外
    // })
}));
app.get('/', (req, res) => {
   
    // 获取 session
    if (req.session.username) {
   
        res.send('欢迎 ' + req.session.username + ' 回来')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值