cookie-session
用户和服务器通过发送http请求进行交互,而http是一个无状态协议,也就是说这一次请求和上一次的请求之间是没有任何关系的。为了让服务器知道是同一个用户端发送的请求,我们可以通过浏览器保存一些信息,每次发送请求的时候都带到服务器端,服务端根据这些信息来判断是不是同一个用户进行的访问。
服务器给浏览器只种cookie,使用cookie-parser中间件。
服务器给浏览器种cookie的同时在服务器上生成session,使用cookie-session中间件。
1. 安装
在终端中执行以下命令
npm install cookie-session
或者使用yarn 安装
yarn add cookie-session
2. 导入
使用require导入到模块中
const cookieSession=require("cookie-session");
3. 操作session的方法
设置:req.session.key=value;
读取:req.session.key
删除:delete req.session.key 或者 req.session.key=null;
4. 使用
cookie-session的一些配置项:
- name:[String],要设置的Cookie的名称,默认为express:sess。
- keys:[Array],是个数组,用于签名和验证Cookie值的键列表。设置Cookie时始终使用签名keys[0],验证时使用其它密钥。
- secret:[String],如果没有设置keys,将使用secret作为单一密钥。
- maxAge:[Number],设置有效时间,为毫秒数。
- 关于cookie的一些配置项:
- maxAge:[Number],设置cookie的有效时间,为毫秒数。
- expires:[Date],设置cookie的过期日期,是一个Date对象,默认在会话结束时过期。
- domain:[String],设置cookie的域,无默认值。
- secure:[Boolean],设置cookie是否仅通过HTTPS发送。
- httpOnly:[Boolean],设置cookie是否仅通过HTTP(S)发送,并且不提供给客户端JavaScript,默认为true。
案例:
var cookieSession = require('cookie-session');
var express = require('express');
var app = express();
//设置中间件,keys和secret必须要有一个
app.use(cookieSession({
name:"sess",
keys:["aaa","bbb","ccc"],
maxAge:24*60*60*1000, //有效时间为24小时
}))
app.post("/login",(req, res) {
let {username,password} = req.body;
//给浏览器返回cookie,同时服务器设置session
req.session.username = password;
//返回数据给浏览器
res.send({message: "登录成功"});
});
app.get("/getInfo",(req,res){
//判断是否有对应的session
if (req.session.username) {
res.send({message:"数据信息"})
} else {
res.send({message: "请先登录"})
}
});
app.get("/logout",(req,res){
//删除session
req.session.username=null;
res.send({message: "退出成功"})
});
app.listen(3000)
使用req.session 设置值后,在浏览器端就可以看到对应的cookie值。
同时在每次请求的时候,cookie会被写入request.header中,带到服务器端,服务器拿到cookie中携带的sessionid后,会自动找到对应的session,这个过程是在服务器内部完成的,不需要干涉。
如果cookie被篡改,服务器根据篡改后的sessionid,找不到对应的session,则说明没有存储这个用户的状态。
当手动清除浏览器的cookie后,那么sessionId也就没有了,所以当再次请求的时候,服务器无法获得sessionid,也就没有办法获取对应的session,无法对当前请求的用户进行判断。