cookie和session
cookie
cookie:浏览器在电脑硬盘中开辟的一块空间,主要供服务器端存储数据。
- cookie中的数据是以域名的形式进行区分的。
- cookie中的数据是有过期时间的,超过时间数据会被浏览器自动删除。
- cookie中的数据会随着请求被自动发送到服务器端。
当第一次访问网站的时候,服务器端会随着请求发送给客户端一个cookie;而当再次访问该网站的时候,cookie会被自动加入到请求头当中发送给服务器端。
session
session:实际上就是一个对象,存储在服务器端的内存中,在session对象中也可以存储多条数据,每一条数据都 有一个sessionid做为唯一标识。而http作为无状态协议-即客户端发送请求到服务端建立一个连接,请求得到响应后连接立即中断,服务端不会记录状态,而session和cookie可以配合实现身份的验证和记录。
工作原理
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对,然后将sessionID(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带sessionID(cookie),找到对应的session(value)。而客户的信息都保存在session的value值当中。
cookie和session如何协调实现登录验证
node.js中如何使用session express-session包
注:session的数据不会保存在cookie当中,浏览器的cookie当中只是保存了seesion ID。而真正的session数据保存在服务器端。
参数详解
express-seesion接收一个options对象属性
cookie
cookie的配置对象,默认值是{path:'/',httpOnly:true,secure:false,maxAge:null}
cookie.domain
指定属性的值。默认情况下,没有设置域,大多数客户将认为cookie只适用于当前的domain.
cookie.expires
默认情况下,没有设置过期,大多数客户将认为这是一个“非持久性cookie”,并将在退出web浏览器的情况下删除它
cookie.maxAge
这是通过获取当前服务器时间并将毫秒数添加到该值中以计算日期时间来完成的。默认情况下,未设置maxAge
cookie.secure
如果为真,则设置该属性,否则不设置。默认情况下,未设置属性。将其设置为真时请注意,因为如果浏览器没有HTTPS连接,则兼容的客户端将来不会将cookie发送回服务器。
推荐的选项是设置为真。 但是,它需要启用https的网站,即对于安全cookie而言,HTTPS是必需的。如果设置为真,并且您通过HTTP访问网站,则不会设置cookie。
secret
一个String类型的字符串,作为服务器端生成session的签名
name
服务器端返回客户端的key的名称,默认是connect.sid,可以自己指定,即保持在本地的cookie的名字
resave
强制保存seesion,默认为true,建议设置为false
rolling
在每次请求时强行设置cookie,这将重置cookie过期时间。默认是false
saveUninitialized
saveUninitialized强制将未初始化的session存储。当新建了一个session且未设定属性或值时,它就处于 未初始化状态。在设定一个cookie前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默 认:true)。建议手动添加。
const express = require('express');
const session = require('express-session');
var app = express();
//拦截所有的请求,配置服务器端的session
app.use(session({
secret: 'secret key',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}))
app.get('/login',(req,res)=>{
//...
//判断成功登录之后,设置session
req.session.username = username;
})
//通过req.session获取
app.get('/user', (req, res) => {
console.log(req.session.username);
});
Session.destory(callback)
销毁session并且重置属性
req.session.destory(function(err){
//获取不到session值
})
//可以应用在用户退出登录的过程,调用以上代码