深入浅出解析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);

猜你喜欢

转载自www.cnblogs.com/tengx/p/12587306.html