深入浅出解析cookie与session
1:第一点想要了解一样技术必须了解它的哲学,也就是这项技术是为了解决什么问题而诞生的它存在的意义是什么?
因为HTTP是无连接的,当请求结束连接就会中断所以会产生身份识别的问题。
因此诞生了cookie甚至于在localStorage出现之前浏览器存储功能都是依靠cookie来完成的
但是它的原理简单到爆,一句话就是当浏览器访问服务器时,服务器会向浏览器发送一个cookie
可以理解为标识符,下次浏览器再向服务器发送请求时在上行报文中携带这个标识符(cookie)
服务器就能够根据标识符做出识别,当服务器在下行报文中设置kookie的持续时间
那么浏览器在一定时间内访问该服务器都会携带这个cookie,kookie的本意是曲奇,老外喜欢拿饼干做信物
所以kookie就是一个浏览器跟服务器通讯的信物,如果是中国人发明可能就是黑话,这个基础是建立在HTTP无连接
2:那么什么是session有人说session很抽象,难以理解其实session对比cookie更好理解更简单
cookie需要服务器在下行报文中设置,那么session完全不需要,session依赖于cookie甚至可以为就是cookie
只是做了简单的升级,有一个唯一代理的概念
也就是说当浏览器第一次向服务器发送请求时,服务器是不认识浏览器的,因为浏览器上行报文没携带信物cookie
这个时候你服务器就得设置,给浏览器返回一个信物cookie下次浏览器再来不就认识了?
但问题是有人觉得服务器设置的信物cookie五花八门,而且过于简单,所以session出现了
服务器可以设置是否开启session每门语言都不同等下举例。
如果你服务器设置了开启session那么此时服务器会根据hash算法随机生成一串乱码放到内存中
同时将这一串乱码通过下行报文发送给浏览器,这一切都是透明的,也就是不用你程序员自己设置了,我服务器自动干了
还是那回事服务器给浏览器一个信物,浏览器下次来就拿着这串乱码,跟服务器内存中的乱码比较
就跟对黑话一样,对上了就OK了,实际上你是不是你服务器那管这些,只管对口号。
例如我登陆了博客园,博客园服务器给我发了一串乱码,这个时候你拿着这串乱码就能登陆我的后台。
同时服务器会根据这串乱码,以哈希结构缓存一些信息,浏览器进入服务器只要黑话对上了
那么就可以读取到内存中的信息。
node.js 中开启session,那么每一个浏览器访问服务器时服务器都会发送一个cookie给浏览器作为信物,乱码
var express = require("express"); var formidable = require("formidable"); var session = require('express-session') var app = express(); app.set("view engine", "ejs"); // 开启唯一代理session app.set('trust proxy', 1); app.use(session({ secret: 'lalala', saveUninitialized: true, cookie: { maxAge: 86400 } })); //首页 app.get("/", function(req, res) { //呈递模板 res.render("shouye"); }); app.post("/login", function(req, res) { }); app.listen(3000);
我们就可以根据session缓存的特性做一些操作
var express = require("express"); var formidable = require("formidable"); var session = require('express-session') var app = express(); app.set("view engine" , "ejs"); app.set('trust proxy', 1); app.use(session({ secret: 'lalala', saveUninitialized: true, cookie: { maxAge: 86400 } })); //首页 app.get("/" , function(req,res){ //呈递模板,把登录信息也带上去: res.render("shouye" , { login : req.session.login , yonghuming : req.session.name , anlian : req.session.love }); }); //登录 app.post("/login" , function(req,res){ var form = new formidable.IncomingForm(); form.parse(req , function(err , fields){ req.session.login = true; req.session.name = fields.name; req.session.love = fields.love; res.redirect("/"); }); }); app.listen(3000);