愿奴胁下生双翼——— 详解cookie和session
cookie和session都是基于web服务器的,不同的是cookie存储在客户端而session存储在服务器。
当用户浏览网站时,web服务器会在浏览器上存储一些当前用户的相关信息,在本地Web客户端存储的就是cookie数据。服务器会根据cookie给浏览器特殊的数据返回。
总之, cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务端保存状态的方案。cookie的内容主要包括:名字,值,过期时间, 路径, 域。路径和域一起构成Cookie的作用范围。若不设置过期时间,
浏览器关闭之后便会消失这种cookie为会话 cookie。会话cookie不存在硬盘上,直接存在内存里,设置过期时间cookie才会存在硬盘上。
seesion机制是一种服务期端的机制,服务器使用一种散列表的结构来保存信息。当程序需要为某个客户端请求创建一个session时,服务器首先检查客户端的请求里是否包含了一个session的标识,已经有了就查询,没有就创建。
标识会在响应中返回到客户端保存在cookie里。
node,js本身没有提供session模块,我们可以根据session的功能实现session。
var start = function (res, req) { var conn = {res: res, req: req}; var cookies = {}; if (typeof conn.req.headers.cookie != 'undefined') { conn.req.headers.cookie.split(';').forEach((cookie) => { "use strict"; let parts = cookie.split('='); cookies[parts[0].trim()] = (parts[1] || '').trim(); }) } else { cookies.SESSID = 0; } var SESSID = cookies.SESSID; if (typeof sessions[SESSID] != 'undefined') { // 存在 session = sessions[SESSID]; if (session.expires < Date()) { delete sessions[SESSID]; return newSession(conn.res) } else { var dt = new Date(); dt.setMinutes(dt.getMinutes() + 30); session.expires = dt; return sessions[SESSID]; } } else { return newSession(conn.res); } } function newSession(res) { var chars = '0123456789ABCDEFGHJKLHKJLYIUVUIqwertyuioplkjhsbsinkcnbj'; var SESSID = ''; for (var i = 0;i<40;i++) { var num = Math.floor(Math.random() * chars.length); SESSID += chars.substring(num, num+1) } if (typeof sessions[SESSID] !== 'undefined') { return newSession(res); } var dt = new Date(); dt.setMinutes(dt.getMinutes() + 30); var session = { SESSID: SESSID, expires: dt } sessions[SESSID] = session; res.setHeader('Set-Cookie', 'SESSID=' + SESSID); return session; } function cleanSessions() { for (sess in sessions) { if (sess.expires < Date()) { delete sessions[sess.SESSID] } } }
以上是实现简单的session管理的代码,实现之后我们现在开始探究需要session机制的原因:
上面的代码中我们创建了sessionid分别存储在服务端和浏览器的cookie里,当浏览器发出请求时,会将sessionid发送到服务端,服务端可以根据sessionid来获取到一段时间内用户的操作状态,sessionid存在过期时间。
假设没有session机制存在,而http协议是无状态的,也就是没有一个特定的标识来标识是哪个浏览器发出的请求,这样的话,无法分辨用户。这便是session产生的原因。session可以存在文件, 数据库,内存中。
也是就是说session是一种为了解决问题而存在的概念,cookie是实际存在的东西。session的所有操作都在服务端。