愿奴胁下生双翼——— 详解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的所有操作都在服务端。
愿奴胁下生双翼——— 详解cookie和session的更多相关文章
- 详解 Cookie 和 Session 关系和区别
在技术面试中,经常被问到“说说Cookie和Session的区别”,大家都知道,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,你能说出几点?今天个推君就和大 ...
- 详解Cookie、Session和缓存
1 Cookie和Session Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实 ...
- 详解cookie与session的区别,讲得最透彻的一篇文章
在PHP面试中 经常碰到请阐述session与cookie的区别与联系,以及如何修改两者的有效时间. 大家都知道,session是存储在服务器端的,cookie是存储在客户端的,session依赖于c ...
- Linux下ps命令详解 Linux下ps命令的详细使用方法
http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...
- Linux下rar命令详解
Linux下rar命令详解 用法: rar <命令> -<选项1> ….-<选项N> < 操作文档> <文件…> <@文件列表…> ...
- linux下tar命令详解
linux下tar命令详解 tar是Linux环境下最常用的备份工具之一.tar(tap archive)原意为操作磁带文件,但基于Linux的文件操作机制,同样也可适用于普通的磁盘文件.ta ...
- 在telnet下操作memcache详解(操作命令详解)
这篇文章主要介绍了在telnet下操作memcache详解,telnet下的memcache操作命令详解,需要的朋友可以参考下 在定位问题.测试等时候经常需要对memcache的数据进行一些操作,但是 ...
- [r]Ubuntu Linux系统下apt-get命令详解
Ubuntu Linux系统下apt-get命令详解(via|via) 常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package ...
- Linux下chkconfig命令详解(转)
Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...
随机推荐
- 集合详解(python)
集合概念 集合是一个数学概念:由一个或多个确定的元素所构成的整体叫做集合. 集合中的元素三个特征: 确定性(元素必须可hash) 互异性(去重)--将一个列表变为集合,就自动去重了 无序性(集合中的元 ...
- struts2基于注解配置action
如果使用struts2,就需要配置文件或者注解,关于struts2的配置文件struts.xml非常熟悉,对于注解可能spring使用的比较多.配置文件的繁琐衬托出了注解的简洁方便,一条或者几条注解解 ...
- [Luogu 1395] 会议
题目 Description 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那 ...
- getPropertyValue 获取CSS样式
新学习一个js 的方法 getPropertyValue (实现 js框架中 css 的最终调用的函数),取得元素最终计算出的css 样式 DEMO: <!DOCTYPE html> ...
- Spring AOP: 织入的顺序
spring AOP 采用和 AspectJ 一样的优先顺序来织入增强处理:在进入连接点时,高优先级的增强处理将先被织入:在退出连接点时,高优先级的增强处理会后被织入. 当不同的切面里的两个增强处理需 ...
- java排序算法(七):折半插入排序
java排序算法(七):折半插入排序 折半插入排序法又称为二分插入排序法,是直接插入排序法的改良版本,也需要执行i-1趟插入.不同之处在于第i趟插入.先找出第i+1个元素应该插入的位置.假设前i个数据 ...
- SQL注入之Sqli-labs系列第三篇
废话不在多说 let's go! 继续挑战第三关(Error Based- String) 1.访问地址,加入参数后 and 1=1和and 1=2进行测试,木有任何动静 2.再使用 ' 出现报 ...
- 用python程序来画花
from turtle import * import time setup(600,800,0,0) speed(0) penup() seth(90) fd(340) seth(0) pendow ...
- 下一个ajax异步请求被挂起问题
异步请求按理来说应该是会不受其它ajax请求影响的,但如果是服务端访问了Session就不能这么说了. 了解了asp.net的会话管理,那我们来看看今天要谈到的主题: IReadOnlySession ...
- 【Spring系列】Spring mvc整合druid
一.pom.xml中添加druid依赖 <!-- druid --> <dependency> <groupId>com.alibaba</groupId&g ...