Node中的Cookie和Session
程序员文章站
2024-02-02 23:21:52
1、Cookie HTTP是无状态协议。例:打开一个域名的首页,进而打开该域名的其他页面,服务器无法识别访问者。即同一浏览器访问同一网站,每次访问都没有任何关系。 Cookie的原理是:客户端浏览器在第一次访问服务器后,服务器返回一段json数据进行标识,此后当客户端浏览器再次访问同一个域时,每次都 ......
1、cookie
http是无状态协议。例:打开一个域名的首页,进而打开该域名的其他页面,服务器无法识别访问者。即同一浏览器访问同一网站,每次访问都没有任何关系。
cookie的原理是:客户端浏览器在第一次访问服务器后,服务器返回一段json数据进行标识,此后当客户端浏览器再次访问同一个域时,每次都携带此cookie信息。
特点
- cookie是不加密的,用户可以*看到;
- 用户可以删除cookie,或者禁用它,未设置失效时间,则默认关闭浏览器后失效
- cookie可以被篡改
- cookie可以用于攻击
- cookie存储量很小。(小于4k)
cookie具有不可跨域名性。根据cookie规范,浏览器访问google只会携带google的cookie,而不会携带baidu的cookie。google也只能操作google的cookie,而不能操作baidu的cookie。
cookie在node.js中使用:
1 const cookieparser = require('cookie-parser'); //模块 cookie-parser 2 const app = express(); 3 app.use(cookieparser()); //中间件 4 app.get('/',(req,res)=>{ 5 res.send('根路由'); 6 }) 7 app.get('/login',(req,res)=>{ 8 //获取客户端cookies 9 console.log(req.cookies); 10 11 //服务器下发cookie 12 res.cookie('heaven','666',{ 13 maxage:900000 //有效时间,毫秒 14 }); 15 res.send('ok'); 16 }) 17 18 app.listen(3000);
2、session
服务器需要记录用户的状态,依赖cookie跟踪session,第一次创建session时,服务端会在http协议中告诉客户端,需要在cookie里面记录一个session id,以后客户端每次请求携带此session id,服务器就能识别客户端。
特点
- session不是一个天生就有的技术,而是依赖cookie。当一个浏览器禁用cookie的时候,登录效果消失;或者用户清除了这个cookie,登录也消失;
- session比cookie不一样在哪里呢?session下发的是乱码,并且服务器自己缓存一些东西;下次浏览器带着乱码上来,此时与缓存进行比较,看看是谁?
session在node.js中使用
/* session 数据存放在服务端,但索引存放在浏览器,浏览器是根据cookieid识别对应的session npm i express-session -s 使用session模块 */ const express = require('express'); const session = require('express-session'); // 解析session的模块 express-session const app = express(); //启动session的中间件,公式 app.use(session({ //要求客户端设置一个加密的cookie secret:'heaven', //任意字符都行,给cookie加密 cookie:{maxage:300000}, resave:true, saveuninitialized:true, })) //中间件是按先后顺序执行的,所以放在前面拦截 app.get('/favicon.ico',(req,res)=>{ return; }) app.get('/',(req,res)=>{ res.send('你的足迹是'+req.session.lvyou); }) app.get('/:city',(req,res)=>{ let city = req.params.city; // console.log(req.session); let cityarr = req.session.lvyou || []; cityarr.push(city); req.session.lvyou = cityarr; res.send("你今天去了"+city); }) app.listen(3000);
/* 将session从内存中提取到mongo数据库内 npm i connect-mongo -s 将session存入mongo数据库的模块 */ const express = require("express"), app = express(), session = require("express-session"), mongosession = require("connect-mongo")(session), mongoose = require("mongoose"); //连接数据库 mongoose.connect("mongodb://localhost/bounty",{usenewurlparser: true}) //session公式 app.use(session({ secret:"doukeyi", //秘钥,加密 rolling:true, //每次交互(操作页面,a标签,ajax)重新设定时间 cookie:{maxage:1000*60*60}, //cookie有效期 1小时 resave:false, //是否每次请求都重新保存数据 saveuninitialized:false, //是否默认设置初始值 store:new mongosession({ url:"mongodb://localhost/bounty" //session存入数据库,到期后自动清除数据库 }) })) /* 清除session */ router.get("/logout",function (req,res) { req.session.destroy(); res.redirect("/login"); })
3、区别
- cookie是明码;session是乱码;
- cookie存在客户端浏览器; session存在服务器;
- cookie内存小;session内存大;