express 使用cookie-session 中间件判断用户的状态

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值。
session
同时在每次请求的时候,cookie会被写入request.header中,带到服务器端,服务器拿到cookie中携带的sessionid后,会自动找到对应的session,这个过程是在服务器内部完成的,不需要干涉。

如果cookie被篡改,服务器根据篡改后的sessionid,找不到对应的session,则说明没有存储这个用户的状态。
session
当手动清除浏览器的cookie后,那么sessionId也就没有了,所以当再次请求的时候,服务器无法获得sessionid,也就没有办法获取对应的session,无法对当前请求的用户进行判断。

发布了130 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Charissa2017/article/details/105182176