首页 > 编程知识 正文

session和cookie工作原理,描述cookie和session的作用

时间:2023-05-05 10:08:14 阅读:284650 作者:758

cookie:浏览器在客户端电脑硬盘中开辟的一块空间,主要用来存储服务端数据(比如sessionId)。
cookie中的数据是以域名的形式进行区分的。
cookie中的数据是有过期时间的超过时间会被浏览器自动删除。
cookie中的数据可以随着请求被发送到服务器端。

客户端第一次向服务器端发送请求时是没有cookie的,请求后服务器端会在cookie中存入一些数据。下次在访问相同的服务器就会带上cookie中的数据。

session:实际上是一个对象,存储在服务器端的内存中,在session对象中也可以存储多条数据,每一条数据都有一个sessionid作为唯一标识。
建议:重要数据存session(相对安全),不重要数据存cookie(全存session影响服务器性能)。

利用cookie和session登录的原理:
客户输入账号密码进行登录,服务器端进行验证,验证成功则生成sessionId,并且在session对象中存储当前用户信息。服务器端将sessionId写入客户端cookie中,当客户端下次访问服务器端时cookie会被自动发送给服务器端,服务器端在cookie中拿到sessionId然后在服务器端的session对象中查找sessionId进行验证,验证成功说明用户是登陆状态,则可以为其响应只有在登陆状态才能响应的数据。

在node.js中使用session功能需要借助第三方模块:express-session ,这是由express官方提供的一个中间件函数。所以用app.use()拦截所有请求并使用session函数进行处理。方法内部做了哪些事情呢?他会为请求对象下面添加一个属性session ,session属性的值是一个对象,可以在用户登录成功后保存用户信息,方法内部会在我们向session对象存储数据时生成sessionId(当前存储数据的唯一标识),然后将sessionId存储在客户端的cookie中,然后当客户端再次访问服务器端时方法会从客户端发送过来的cookie中拿到sessionId,根据sessionId从服务器端的session对象中找到对应客户信息进行验证,实现登录功能。

const session = require(‘express-session’)
app.use(session({secret:‘secret key’}))//secret的值是可以随便写的,作用是对要存储的cookie信息进行加密,当客户端再次访问服务器端时服务器端可以对拿到的cookie进行解密。这样做的好处是客户端虽然可以查看cookie的信息,但是看到的是一堆加密的字符串,这样可以提高数据的安全性。

将session持久化存储:
①将session存储到mongodb数据库当中:

var express = require('express'); var session = require('express-session'); var MongoStore = require('connect-mongo')(session);//目前已知唯一用来存储session到数据库的包 app.use(session({ secret: config.cookieSecret, //secret的值建议使用128个随机字符串 cookie: {maxAge: 60 * 1000 * 60 * 24 * 14}, //过期时间 resave: true, // 即使 session 没有被修改,也保存 session 值,默认为 true saveUninitialized: true, store: new mongoStore({ url:'mongodb://127.0.0.1:27017/xxx'//xxx:数据库名,存储时会自动在xxx生产session集合名 }) })) app.listen(80);

②将session数据同步到redis中:还需下载redis数据库,见:
https://blog.csdn.net/qq_41812254/article/details/96576794

var express = require('express'); var session = require('express-session'); var RedisStore = require('connect-redis')(session); var app = express(); var options = { "host": "127.0.0.1", "port": "6379", "ttl": 60 * 60 * 24 * 30, //session的有效期为30天(秒) } // 此时req对象还没有session这个属性 app.use(session({ store: new RedisStore(options), secret: 'express is powerful' })) app.listen(80);

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。