为什么需要“会话跟踪”
无状态的HTTP协议
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
通俗的说,打电话的过程就是一个会话的过程。会话跟踪则是为了记录通话内容所需要的录音笔。
会话的生命周期:
会话开启:打开浏览器(相当于拨通电话)
会话结束:关闭浏览器(相当于挂断电话)
会话范围:
会话开启 => 会话结束
(会话一旦开启,只要不关闭会话,中间的通话都是会话数据)
会话的分类:
Cookie: 会话数据存储在浏览器端
Session:会话数据存储在服务器端
Cookie
工作原理:
1.服务器将需要会话跟踪的信息制成一段文本信息,将文本储存在浏览器(本地磁盘或者内存)上。
2.文本信息中储存的是某个一级域名(百度,谷歌等)的信息( HTTP头信息,有效期等)。
3.当浏览器中存在百度Cookie的场合,访问百度时,将百度的Cookie信息传递给服务器。
4.服务器通过Cookie获取会话跟踪的数据。
实际应用:
1.浏览器中“记住密码”和“恢复关闭网页”的功能,就是将储存在本地磁盘中的硬盘式Cookie的信息跟踪到浏览器上。
2.浏览器中“返回上一个画面”的功能,就是将储存在内存中的内存式Cookie的信息跟踪到浏览器上。
使用Cookie的注意事项
修改和删除cookie
Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,覆盖原来的Cookie。
注意:修改、删除Cookie时,新建的Cookie除value、MaxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
设置cookie的安全属性
HTTP协议是不安全的,虽然在创建会话跟踪之后Cookie无法修改和删除,但是在创建之前是可以修改的。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。
注意:secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。
Session
工作原理:
1.服务器会向客户浏览器发送一个每个会话特有的会话编号session id,让它进入到cookie里。
2.服务器同时也把session id和对应的会话信息以MAP的形式记录在服务器上,这些记录就是session列表。
3.客户端浏览器再次访问时,会发送cookie给服务器,其中就包含session id。
4.服务器从cookie里找到session id,再根据session id找到会话跟踪的数据。
实际应用:
为以下应用提供数据来源。
1.根据短时视频用户的喜好推荐相关视频。
2.打车软件的热力图。
3.在手机附近说一些话题,推送相关消息,
使用Session的注意事项
Session的生命周期和有效期设置
如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。
Session的超时时间为maxInactiveInterval属性, Tomcat中Session的默认超时时间为20分钟。
可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(int seconds)修改。
Session的超时时间也可以在web.xml中修改。例如修改为60分钟:
<session-config>
<session-timeout>60</session-timeout> <!-- 单位:分钟 -->
</session-config>
注意: <session-timeout>参数的单位为分钟,而setMaxInactiveInterval(int seconds)单位为秒。
Cookie与Session的区别
1、对象不同
cookie:是针对每个网站的信息,每个网站只能对应一个,其他网站无法访问,这个文件保存在客户端。每次访问网站,浏览器都会查找该网站的 cookies,如果有,则会将该文件发送给客户端。cookies文件的内容大致上包括了诸如用户名、密码、设置等信息。
session:是针对每个用户的,只有客户端才能访问,程序为该客户添加一个 session。session中主要保存用户的登录信息、操作信息等等。此 session将在用户访问结束后自动消失(如果也是超时)。
2、存储数据大小不同
cookie:一个 cookie存储的数据不超过3K。
session:session存储在服务器上可以任意存储数据。当 session存储数据太多时,服务器可选择进行清理。
3、生命周期不同
cookie:cookie的生命周期当浏览器关闭的时候就消亡了,cookie的生命周期是累计的,从创建时就开始计时,超过设定的时间后cookie生命周期结束。
session:session的生命周期是间隔的,从创建时开始计时如在设定时间内没有访问session,那么session生命周期就被销毁。
4、存储位置不同
cookie:cookie数据保存在客户端。
session:session数据保存在服务器端。
5、数据类型不同
两者都是key-value结构,但针对value的类型是有差异的。
cookie:value只能是字符串类型。
session:value是object类型。
6、安全性不同
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session。