session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的情况时候我们需要更加深入的理解session的机制,本文将梳理下session的相关知识,为设计可替代web容器自带的session机制打个基础。
cookie
cookie是服务器发送给浏览器并在用户浏览时存储在用户计算机上的一小部分数据。使用HTTP头在浏览器和服务器之间生成和共享Cookie。
ps:指某些网站为了辨别用户身份而存储在用户本地终端上的数据
它允许服务器存储和检索来自客户端的数据,它存储在客户端的文件中,并且可以存储的最大的cookie大小在任何浏览器中都被限制为4K。
分类
Cookie总是保存在客户端中,按照客户端中的存储位置,可分为内存Cookie和硬盘Cookie
顾名思义内存Cookie有浏览器维护,保存在内存中,浏览器关闭后消失,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手动清理,或是到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。
用途
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
Cookie的缺陷
- 根据上面所说的,Cookie会被附加在每一个HTTP请求中,由于HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非使用HTTPS
- Cookie的大小限制在4K左右,对于复杂的存储需求来是不够用的。
Session
当任何用户对web应用程序进行任何更改(如登录或注销)时,服务器都不知道系统上的人是谁。为了解决这个问题,PHPsession将介绍哪些存储用户信息可用于多个网页。
session变量包含有关单个用户的信息,并且在所有的地方都可以访问。
PHP代码以特定会话的散列形式生成唯一标识,该标识是32个十六进制数字的随机字符串,如pvc19hdj5961abfk9lfg4b9l40c被称为PHPsessionID。
http request
Cookie: PHPSESSID=pvc19hdj5961abfk9lfg4b9l40c;......
centos6.8 中:session存储地址
/var/lib/php/session/sess_pvc19hdj5961abfk9lfg4b9l40c
session文件
Http请求
根据上面的一串东西 我们好像发现了什么了不得的东西(牙慧-_-!)
SESSID或COOKIE是其用于识别已经登录到网站的用户的唯一编号。SESSID存储在服务器内部,它在该用户的访问(会话)期间分配给特定用户。该SESSID可被存储为一个cookie,表格字段,或URL。
Session | **Cookies |
---|---|
数据存储在服务器上 | 数据存储在浏览器中 |
会话数据更安全,因为它们从不在每个HTTPRequest上运行。 | 使用每个HTTP请求。 |
可以存储对象(存储大量数据) | 可以存储字符串类型(最大文件大小为4kb) |
Session Cannot be used for Future Reference | Cookies are mostly used for future reference |
每个客户端请求服务器时,服务器生成 session 时,都会给这个 session 分配一个唯一 id, 用来标示这个 session, 存到文件时,文件名就是这个 id,
然后再把这个 id 返回到客户端,并告诉客户端保存到 cookie 中.
header 响应
set-cookie:sessionid=23333333333
如何设置cookie
PHP透明地支持HTTP.cookie,可以使用封装好地PHP函数setcookie()或setrawcookie()函数来设置cookie。cookie是HTTP标头地一部分,因此setcookie()函数必须在其它信息被输入到浏览器前调用,和header()函数地限制类似。如果php.ini配置文件设置variables_order中包括C,则任何从客户端发送地cookie都会被自动包括进$_COOKIE自动全局数组。
这写概念基本都是w3c和上面的,详情请转至~.~ 哦还有会话劫持相关的内容 详情请点击http://php.net/manual/en/session.configuration.php#ini.session.use-only-cookies
session共享方案
PHP使用redis存储session来达到session共享的目的。
。。。。。。。。。。。。。。。。。
session.save_handler = Redis
//Redis不需要密码验证
session.save_path = “tcp://127.0.0.1:6379”
session.save_path = “tcp://127.0.0.1:6379?auth=password”
时:2018年4月17日