愿奴胁下生双翼——— 详解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不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...
随机推荐
- JS中原始值和引用值的储存方式
在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfine ...
- git记录(给老婆找的地址)
ssh配置 https://blog.igevin.info/posts/generate-ssh-key-for-git/ git 查看某个文件的修改历史 1. git log -p filenam ...
- Java线程中断机制-如何中断线程
介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...
- sh, 批量执行Linux命令
step 1:创建一个sh批处理命令文件 # vim /etc/batch_ssh/install_redis.sh step 2:给当前用户,能够执行sh脚本权限# chmod install_re ...
- 【HTML】 HTML基础知识 表单
html 表单 表单的标签是<form>,用于给网站的后台提交数据.提交的数据格式原本是什么样不太清楚,以python的flask框架来看,我从表单中得到的数据是一个字典(flask.re ...
- Jmeter-基于Ubuntu运行
这几天折腾了很久,整合了一套接口自动化的持续集成工具,先从最基础的运行Jmeter说起.由于我是用Docker部署的持续集成环境,所以接口运行必须在服务器上 一:在Linux服务器先安装jdk 1:先 ...
- [BZOJ 3813]奇数国
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 736 Solved: 416[Submit][Status][Discuss] ...
- 上海依图-电话面试-angularjs
树的遍历(树结构:node.name,node.children),输出node.name(递归) 指令的scope的绑定策略(@绑定DOM数学单向绑定:=双向数据绑定:&绑定父作用域函数) ...
- C程序第二次作业
2-1删除字符串中数字字符 1.设计思路 (1)主要描述题目算法 第一步:遍历指针s所指的s数组. 第二步:如果 * (s+i)在0至9之间的话,则跳过此 * (s+i). 第三步:如果* (s+i) ...
- 【转载】NetFPGA-1G-CML从零开始环境配置
##环境 深度Linux ###环境配置 ```bash sudo apt-get install libsigc++ sudo apt-get install qgit sudo apt-get i ...