愿奴胁下生双翼——— 详解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不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...
随机推荐
- ECMAScript 6入门 - 变量的解构赋值
定义 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构赋值不仅适用于var命令,也适用于let和const命令. 解构赋值的规则是,只要 ...
- Java测试(一)
关于while和do-while循环,下列说法正确的是 A 两种循环除了格式不同外,功能完全相同 B 与do-while语句不通的是,while语句的循环至少执行一次 C do-while语句首 ...
- 【Docker】Docker概述
[Docker] Docker可以说是近几年非常热门的技术之一了.不管是别人敦促我还是从自己的想法来说,都觉得Docker这玩意儿肯定是要好好学习一下的,无奈没啥时间专门播出来给Docker,一直以来 ...
- Ios 若干兼容处理
最后处理兼容真是各种苦逼,还算好,最后解决了,再此总结一下 position:fixed 和 input 的问题? ios 对position:fixed 的定位处理兼容性不是很好,例如,在同时又in ...
- 新手立体四子棋AI教程(3)——极值搜索与Alpha-Beta剪枝
上一篇我们讲了评估函数,这一篇我们来讲讲立体四子棋的搜索函数. 一.极值搜索 极值搜索是game playing领域里非常经典的算法,它使用深度优先搜索(因为限制最大层数,所以也可以称为迭代加深搜索) ...
- ava集合---HashSet的源码分析
一.HasnSet概述 Hashset实现set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set的迭代顺序.特别是它不保证该顺序恒久不变.此类允许使用Null元素 一.HasnSe ...
- Android学习链接大放送
虽然贴链接这种事情..真是一种很偷懒的做法... 但是我一个小菜鸟,果断还是要以多向别人学习为主... 好资源要和大家分享对不对! 况且..放博客里..比收藏夹的利用几率要大一点! 原作者应该也很喜欢 ...
- div内文字显示两行,多出的文字用省略号显示
用-webkit-私有属性,代码如下:text-overflow: -o-ellipsis-lastline;overflow: hidden;text-overflow: ellipsis;disp ...
- 发布利用 Qt Assistant来做帮助系统的程序遇到的问题
最近,一直在做反演初始模型可视化建模的软件 model Constraint,最后的步骤就是利用 Qt Assistant为自己的程序制作帮助系统. 1.<Qt Creator快速入门>和 ...
- JavaScript(第二十天)【DOM操作表格及样式】
DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本章主要了解一下DOM操作表格和样式的一些知识. 一.操作表格 <table& ...