写在前面
在开始之前,先要理解会话(Session)的含义。Session跟踪是web中常用的技术,用来跟踪用户整个会话。Cookie和Session是常用的绘画跟踪技术。
Cookie是通过客户端记录确定用户身份,而Session通过在服务器端记录信息确定用户身份
1 Cookie机制
理论上,一个用户的所有请求操作都应该属于同一个会话,另一个用户的请求属于其他的一个会话。
Web应用程序是使用HTTP协议传输协议(可恶我计算机网络没学好啊=皿=)。HTTP协议是无状态、无连接协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。所以Cookie设计是为了来实现Cookie跟踪会话。
1.1 什么是Cookie
简而言之,Cookie是一小段文本信息,作为一个通行证。客户端请求服务器,如果服务器需要记录该用户状态,就response一个Cookie给浏览器,客户端浏览器就会保存Cookie作为一个通行证,服务器端依靠这个通行证确认访问者用户身份。
而当浏览器再次请求该网站时,浏览器吧请求的网址连同Cookie一同提交给服务器,服务器再次检查Cookie用来辨别用户状态。服务器还可以根据需要修改Cookie内容。
1.2 Javascript操作Cookie
(……)
1.3 Cookie的不可跨域名性
这一点很好理解,不同的网站向客户端颁发不通的Cookie,A网站和B网站向客户端颁发的Cookie相互不可以修改。一个网站只操作这个网站的Cookie,从而保证用户的隐私安全。
1.4 Unicode编码:保存中文
中文属于Unicode字符,在内存中占4个字符,英文属于ASCII字符,在内存中占两个字节。Cookie使用Unicode字符时候需要对Unicode编码,否则会乱码。
1.5 设置Cookie的所有属性
除了name和value两个一般都会有的属性以外,Cookie还有几个其他常用属性。每个属性对应一个getter方法与一个setter方法。举几个例子:
String name: Cookie的名称,Cookie一旦创建,名称便不可更改;
Object value: Cookie的值,看情况是否需要编码;
int maxAge: Cookie的生存时间,单位为秒,maxAge之后该Cookie失效,如果为负数,则代表该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会保存该Cookie,如果为0,表示删除Cookie,默认值为-1;
boolean secure: 是否使用安全协议传输,比如HTTPS,SSL,默认值为false;
String path: 该Cookie使用的路径;
String domain: 可以访问该Cookie的域名;
int version: 版本号
1.6 Cookie的修改、删除
Cookie不可修改,如果要修改,只能够新建一个同名Cookie添加到response中覆盖原来的Cookie,若要实现删除,则将气maxAge设置为0。
1.7 Cookie的安全性
HTTP协议是无状态、无连接的,而Cookie是服务器端创建的,所以生成一个可信Cookie的关键在于客户端无法伪造出Cookie,我们采取的手段是单向函数。比如计算md5就是一个单向函数,假设写好了一个函数md5(String),我们可以通过这个函数得到结果,但是反推输入却很困难。
生成一个可信的Cookie的方法可以是"用户名:口令(md5值)"作为一个字符串构成一个Cookie发送给客户端。服务器验证的时候将其拆分成“用户名”和“口令(md5值)”在数据库中找到该用户的记录,并继续找到原口令。服务器端根据数据库中存储的口令计算其md5值,并和客户端Cookie的md5值进行比对,若一致,则Cookie有效。
目前根据md5值进行加密只是我作为一个初学者的简单思考,而且在这种方式中,用户的用户名是被暴露的,如果用户使用email作为用户名,那么其email就可以被泄露。
2 Session机制
啊啊啊啊啊头大了……
2.1 什么是Session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,Session保存在服务器上。客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。它和Cookie的差别,举个例子:
A国元首举行一个宴会,到场的人需要进行一个身份验证。Cookie相当于给客人发请帖,根据请帖入场,Session则是相当于等客人到场时查证宴请宾客名单入场。
2.2 Session的生命周期
Session保存在服务器端,为了获取更高的存取速度服务器一般把Session放在内存中,若Session内容太复杂,可能会引起很多问题比如内存溢出等。
Session在用户第一次访问服务器时自动创建,生成后只要用户继续访问,服务器就会更新Session最后访问时间,认为该用户活跃(active)了一次;
若用户长时间没有活跃,超过一个确定的时间,则会被从内存中删除。
2.3 Session对浏览器的要求
虽然Session保存在服务器内,对客户端是透明的,它的正常运行仍然需要客户端浏览器的智齿。这是因为Session需要使用Cookie作为识别标识。HTTP协议是无状态无连接的(不知道多少次重复这个原因了=。=)Session无法根据HTTP来判断是否为同一客户。