跳到主要内容

会话控制

HTTP协议是一个无状态的协议,它无法区分多次请求是否发送自同一客户端。

而我们在实际的使用中,却又大量的这种需求,我们需要通过会话的控制来解决该问题。

cookie是什么?

cookie本质是一个存储在浏览器的文本,随着http请求自动传递给服务器。

  • cookie 是存在于『浏览器端』。
  • cookie 会存在于 HTTP 请求的『请求头』中,传递给服务器 。

也可以说cookie是一个头(请求头/响应头):

  • 服务器以响应头的形式将Cookie发送给浏览器
  • 浏览器收到以后会自动将Cookie保存
  • 浏览器再次访问服务器时,会以请求头的形式将Cookie发回
  • 服务器就可以通过检查浏览器发回的Cookie来识别出不同的浏览器

cookie的不足

  • 各个浏览器对cookie的数量和大小都有不同的限制,这样就导致我们不能在Cookie中保存过多的信息。一般数量不超过50个,单个大小不超过4kb。
  • cookie是由服务器发送给浏览器,再由浏览器将cookie发回,如果cookie较大会导致发送速度非常慢,降低用户的体验。

cookie的使用

// cookie-parser
//引入 express
const express = require('express');
//1.引入cookie-parser
const cookieParser = require('cookie-parser');
// 创建应用对象
const app = express();
//2.设置中间件 cookie 方法中间件内部添加的
app.use(cookieParser());
//设置路由
app.get('/', (request, response) => {
response.send('Hello');
});

//设置cookie
app.get('/set-cookie', (request, response) => {
//3.设置cookie
response.cookie('email', '163');
//设置带有时效性的 cookie 单位 毫秒
response.cookie('name', 'Tom', {maxAge: 3 * 60 * 1000});
response.send('cookie的设置');
})

//获取cookie
app.get('/get-cookie', (request, response) => {
//读取cookie
console.log(request.cookies);

response.send('cookie的读取');
})
//清空 cookie
app.get('/clear-cookie', (request, response) => {
response.clearCookie('email');
response.send('清空cookie');
})

app.listen(80, () => {
console.log('服务已经启动,端口80监听中');
});

注意点

  • cookie 虽然存在于浏览器端, 但是在电脑中不能直接查看 cookie 的内容.
  • cookie 是按照 『域名』 进行分类保存的
  • 发送请求时, 只会携带当前域名下的 cookie 进行请求
  • cookie 是由服务器『响应』回来的 (响应头)
  • set-cookie 中的 『path=/』 是设置此 cookie 生效的路径, / 表明此 cookie 在当前网站下都可用
  • 带有时效性的 cookie, 关闭浏览器不会销毁此 cookie.
  • 不带时效性的 cookie, 关闭浏览器就会销毁, 如果不关闭浏览器, 此 cookie 就一直有效
  • cookie 体积不宜过大, 会影响请求的效率
  • cookie 一般会存储与当前用户相关信息, 例如唯一标识, 用户信息

session

Session 是一个对象,存储特定用户会话所需的属性及配置信息。

我们可以在服务器中为每一次会话创建一个对象,然后每个对象都设置一个唯一的id,并将该id以cookie的形式发送给浏览器, 然后将会话中产生的数据统一保存到这个对象中,这样我们就可以将用户的数据全都保存到服务器中,而不需要保存到客户端,客户端只需要保存一个id即可。

// session 是保存在服务器端的
//引入 express
const express = require('express');
//1.引入 模块
const session = require('express-session');

const app = express();
//2.设置中间件
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
}));

//设置session,用户在登录成功之后,会设置session
app.get('/set-session', (request, response) => {
request.session.name = 'tom';
request.session.email = 'qw@qq.com';
response.send('登录成功');
})

//读取session 检测用户是否登录,会用到session的读取
app.get('/get-session', (request, response) => {
//读取用户名
console.log('当前登录的用户为:' + request.session.name);
console.log('当前登录的邮箱为:' + request.session.email);
response.send('个人中心');
})

//session 的销毁
app.get('/destroy-session', (request, response) => {
request.session.destroy(function () {
console.log('销毁成功');
response.send('安全退出登录');
})
})


app.get('/', (request, response) => {
response.send('Hello');
});

app.listen(80, () => {
console.log('服务已经启动,端口80监听中');
});

cookie和session的区别

1. 存在的位置

  • cookie 存在于客户端,临时文件夹中
  • session 存在于服务器的内存中,一个session域对象为一个用户浏览器服务

2. 安全性

  • cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放
  • session存放于服务器的内存中,所以安全性好

3. 网络传输量

  • cookie会传递消息给服务器
  • session本身存放于服务器,但是通过cookie传递id,会有少量的传送流量

4. 生命周期(以20分钟为例)

  • cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束
  • session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁。 但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期;关机会造成session生命周期的结束,但是对cookie没有影响

5. 大小

  • cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存50个cookie
  • session 保存数据理论上没有任何限制(内存有多大就能有多大)