cookie 的缺陷
-
cookie 是保存在客户端的,虽然为服务器减少了很多压力,但某些情况下,会出现麻烦,比如,验证码:
-
如果这样做,客户端可以随便填写一个别人的手机号,然后从 cookie 中获取到验证码,从而绕开整个验证;
-
因此,有些敏感数据是万万不能发送给客户端的,那要如何实现这一流程呢?
-
可见 session 也是键值对,它保存在服务器端,通过 sessionid 和客户端关联;
session 是什么?
-
session 本质是一段保存在服务端内存中的代码片段,session 的实现一般是基于 cookie 的;
-
cookie 记录凭证,session 记录具体数据;和 cookie 相比,比较安全,session 是存储在服务端的;
session 存在问题
-
session 会占用内存,开销大,传统的 session 保存在内存里,每当用户登录时,在 session 做一次记录,随着认证用户的增多,服务端的开销会明显增大;
-
session 横向扩展差,页面的请求不一定是同一台服务器,如果请求打到不同服务器,那么服务器之间需要共享 session ,此时需要做 session 的持久化,如果持久化失败就出现认证失败;
session 实现
在服务器端生成全局唯一标识符 session_id ,在服务器内存里开辟此 session_id 对应的数据存储空间,将 session_id 作为全局唯一标示符通过 cookie 发送给客户端;
以后客户端再次访问服务器时会把 session_id 通过请求头中的 cookie 发送给服务器;
服务器再通过 session_id 把此标识符在服务器端的数据取出;
var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
//存放会话数据 key卡号 value就是卡号对应的数据对象
var sessions = {};
//与客户端约定的会话ID
var SESSION_KEY = 'connect.sid'
//当用户访问根目录的时候 执行对应的回调函数
app.get('/', function (req, res) {
res.setHeader('Content-Type', 'text/html;charset=utf-8');
// 1. 先取出cookie中的sessionId 卡号
var sessionId = req.cookies[SESSION_KEY];
// 如果有卡号的,也就是有ID的话 老顾客
if (sessionId) {
//取出此卡号对应的信息,余额
var sessionObj = sessions[sessionId];
if (sessionObj) {
//扣掉10块钱
sessionObj.balance = sessionObj.balance - 10;
res.send('欢迎你老顾客,你卡上还剩' + sessionObj.balance);
} else {
genId(res);
}
//如果没有的话就是新顾客
} else {
genId(res);
}
function genId(res) {
//由店家生成一个唯一的卡号
var id = Date.now() + '' + Math.random();
//要在店家的小本上记录一下此卡号对应的余额
sessions[id] = { balance: 100 };
//把这个卡发给顾客带回家
res.cookie(SESSION_KEY, id);
//告诉 用户送他一张卡
res.send('欢迎你新顾客,送你一张价值100元的剪发卡');
}
});
app.listen(9090);
面试题
cookie 和 session 的区别是什么?
参考答案:
- cookie 的数据保存在浏览器端;session 的数据保存在服务器;
- cookie 的存储空间有限;session 的存储空间不限;
- cookie 只能保存字符串;session 可以保存任何类型的数据;
- cookie 中的数据容易被获取;session 中的数据难以获取;
如何消除 session
参考答案:
- 过期时间:当客户端长时间没有传递 sessionid 过来时,服务器可以在过期时间之后自动清除 session;
- 客户端主动通知:可以使用 JS 监听客户端页面关闭或其他退出操作,然后通知服务器清除 session;
计算机网络🛜 cookie
上一篇