欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

express中的cookie和session

程序员文章站 2024-03-20 13:59:58
...

一、无状态的http

http是无状态协议, 简单的说, 当你浏览了一个页面, 然后转到同一个网站的另一个页面, 服务器无法认识到,
这是同一个浏览器在访问同一个网站,换句话说,服务器无法识别两条http请求是否是同一个用户发送的。也就是说服务器端并没有记录通信状态的能力。
但是, 为了用户体验, 我们确实需要让服务器能够记忆用户的一些信息。 cookie应运而生

二、cookie

cookie是一个简单到爆的想法: 当访问一个页面的时候,服务器在下行http报文中,命令浏览器存储一个字符串;浏览器再访问同一个域的时候,将把这个字符串携带到上行http请求中。
第一次访问第一个服务器,不可能携带cookie。必须是服务器得到这次请求,在下行响应报头中,携带cookie信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个cookie

cookie特点:
1.cookie 是不加密的,用户可以*看到
2.用户可以删除cookie或者禁用它
3.cookie可以被篡改
4.cookie可以用于攻击
5.cookie 存储量很小。

express中的cookie,你肯定能想到。 res负责设置cookie, req负责识别cookie。
在express中的使用:cookie-parser

1/安装
npm i -S cookie-parser

cookie 中间件的参数:
path:指定 cookie 影响到的路径
expires: 指定时间格式
maxAge:指定 cookie 什么时候过期
secure:当 secure 值为 true 时,在 HTTPS 中才有效;反之,cookie 在 HTTP 中是有效。
httpOnly:浏览器不允许脚本操作 document.cookie 去更改 cookie。设置为true可以避免被 xss 攻击拿到 cookie

const cookieParser = require('cookie-parser');

app.use(cookieParser());

app.get("/a", (req, res) => {
    console.log(req.cookies) //读取cookie

    res.cookie("amount", 99.8, { //设置cookie
        //domain:设置主域名//(子域名可以找主域名,主域名不可以找子域名;一般情况下一个网站一个cookie)
        //path:"/" //cookie是保存在根路径下的,为了防止访问不到  (不能往下访问只能往*问)
        //secure: 当 secure 值为 true 时, 在 HTTPS 中才有效; 反之, cookie 在 HTTP 中是有效。
        //httpOnly:浏览器不允许脚本操作 document.cookie 去更改 cookie。设置为true可以避免被 xss 攻击拿到 cookie
        maxAge: 14 * 86400 * 1000 //有效期
    })

    res.send("ok")
})


简单模拟登录
const cookieParser = require('cookie-parser');

app.use(cookieParser(
    "ggffdaasadada123ghgfhf8gghgh" //签名
));

app.get("/a", (req, res) => {
    let num = 0;
    console.log(req.cookies) //读取未签名cookie
    console.log(req.signedCookies) //读取签名cookie
    if (req.cookies.amount) {
        res.send("欢迎回来")
    } else {
        res.cookie("amount", "hello", {
            maxAge: 14 * 86400 * 1000, //有效期
            signed: true //是否需要签名的
        })
    }
    res.send("请先登录")
})


三 session

session在计算机网络应用中被称为“会话控制”,
客户端浏览器访问网站的时候,服务器会向客户浏览器发送一个每个用户特有的会话编号sessionID,让他进入到cookie里,服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。客户端浏览器再次访问时,会发送cookie给服务器,其中就包含sessionID。服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。

Session不是一个天生就有的技术,而是依赖cookie

session是存在服务器端的技术,cookie是存储在客户端的技术

cookie以文本格式存储在浏览器上,存储量有限;而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全

session相比cookie而言要安全一些,因为他是存储在服务器的;cookie是明文(也可加密)存储在客户端(浏览器),而且每次请求都会附带发送(可以使用抓包工具获取cookie,不安全)

cookie如果存储内容比较多的话,会给请求造成压力

session因为是存储在服务器的,所以如果过多的依赖session会造成服务器压力(内存和硬盘的压力)

1/安装
npm i -S express-session

2/session 中间件的配置参数:
name: 设置cookie中,保存session的字段名称,默认为connect.sid
store: session的存储方式,默认为存放在内存中,我们可以自定义redis等
genid: 生成一个新的session_id时,默认为使用uid2这个npm包
rolling: 每个请求都重新设置一个cookie,默认为false
resave: 即使session没有被修改,也保存session值,默认为true
saveUninitialized:强制未初始化的session保存到数据库
secret: 通过设置的secret字符串,来计算hash值并放在cookie中,使产生的signedCookie防篡改
cookie : 设置存放sessionid的cookie的相关选项

2.const express = require("express");
const app = express();
const session = require("express-session");

app.use(session({
    secret :  'secret', // 对session id 相关的cookie 进行签名
    resave : true,
    saveUninitialized: false, // 是否保存未初始化的会话
    cookie : {
        maxAge : 1000 * 60 * 3, // 设置 session 的有效时间,单位毫秒
    },
}));

app.get("/", (req, res) => {
    // console.log(req.session);
    if (!req.session['view']) {
        req.session['view'] = 1;
    } else {
        req.session['view']++;
    }
    req.session['amount'] = 99.8;
    res.send(`欢迎你第${req.session["view"]}次登陆,你的余额是:${req.session['amount']}`)
})


app.listen(3000)

相关标签: Node.js