对session和cookie的整理
cookie
1、什么是cookie
是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中。
2、为什么要使用cookie?
这是因为http是无状态的,两次请求间,服务器不知道用户上一次执行了什么操作,这严重的阻碍了交互式web应用程序的实现。服务器可以通过设置或者读取cookie中存储的信息,借此维护用户和服务器会话中的状态
3、cookie有哪些优点
cookie机制将信息存储于用户硬盘,因此可以作为跨页面全局变量
4、cookie有哪些缺陷
- cookie的安全性不够高
cookie的信息是存储在浏览器中的,所以容易被篡改,因此我们不会将很重要的信息存储在cookie中 - cookie可能被禁用
- cookie可能被用户删除
- cookie的存储空间很小(只有4kb左右)
cookie由于每次请求都要向后台发送数据,所以容量要有限制,否则会大大降低网络传输效率。 - cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
5、一般在什么场合使用cookie
- 保持用户的登陆状态
- 跟踪用户的行为,比如记录用户浏览数据,进行商品(广告)推荐
- 创建购物车
6、如何使用cookie
- 服务器端给客户端发送cookie
const express = require('express');
var server = express();
server.use('/aaa/a.html',function(req,res){//只能对aaa目录下的a.html起作用
res.cookie('user','blue',{
path:'/aaa',//cookie存储的路径,匹配该路径才发送这个 cookie。
maxAge:30*24*3600*1000//以毫秒为单位,表示过期时间
});
res.send('ok');
});
server.listen(8080);
- 使用cookie-parser中间件读取cookie
const express = require('express');
const cookieParser = require('cookie-parser');
var app = express();
app.listen(8080);
app.use(cookieParser('aass'));
//这里要注意的是,我们之前在/aaa中请求了cookie,而我们在/中能读取到,是因为cookie是向上级读取的
app.get('/',function (req,res) {
res.secret='aass';
res.cookie('name','GeZi',{
path:'/',//访问哪一个路径的时加上cookie
maxAge:20*60*1000,//cookie的存活时间,单位毫秒
signed:true//是否加签名
});
console.log('没有签名的cookie:',req.cookies);
console.log('签名后的cookie:',req.signedCookies);
res.send(req.cookies);
});
- 清除cookie
res.clearCookie('name')
session
什么是session
Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。
Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。
为什么要使用session
- cookie不够安全
cookie是保存在客户端的数据,容易被篡改,session保存在服务器端,不会被篡改。 - cookie可以存储的内容太少了
session
那么问题来了,既然cookie相对于session有那么大的不足,为什么还需要cookie呢?
因为session是基于cookie实现的,当建立一个新session的时候,向客户端下发一个session-id,让客户端保存session-id在cookie中,下一次发起请求的时候,将session-id发回后台,后台通过session-id,在很多session中查找到相应session-id对应的session进行操作。
一般在什么场合使用session
- 会话管理 登录,购物车,游戏分数或服务器应记住的任何其他内容
- 个性化用户首选项,主题和其他设置
- 跟踪记录和分析用户行为
如何使用session
这里用到cookie-session中间件
const express = require('express');
const cookieParser = require('cookie-parser');
const cookieSeesion = require('cookie-session');
var server = express();
server.listen(8080);
server.use(cookieParser('这段签名的字符串可以是随意的'));
(function () {
var arr = [];
for(var i = 0;i<10000;i++){
arr.push('keys_'+Math.random());
}
server.use(cookieSeesion({
keys:arr,
name:'session_id',//加密的cookie的名字,最后通过这个来从服务端查找到对应的人 maxAge:20*60*1000
}))
})();
server.get('/',function (req,res) {
console.log(req.session['test']);
if(typeof req.session['test'] == 'undefined'){
req.session['test'] = 'xixi';
res.send('这是第一次访问');
}else{
res.send('这不是第一次访问');
}});
cookie和session的区别
-
存放位置不同
Cookie保存在客户端,Session保存在服务端。 -
存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。 -
安全性(隐私策略)的不同
Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。 -
有效期上的不同
只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。 -
跨域支持上的不同
Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 -
对服务器造成的压力不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。