由于 HTTP 是一种无状态协议,当客户端的一次访问请求结束后,服务器无法知道下次来访问的还是不是上次访问的客户端。
Cookie 与 Session 的作用都是保持客户端与服务器的交互状态。但是它们的优点和它们的使用场景是矛盾的。当使用 Cookie 来传递信息时,随着访问量的增加,Cookie 个数越来越多,它占用的网络带宽会很大。面对大访问量的情况,可以用 Session,但是 Session 的致命弱点是不容易在多台服务器之间共享,这限制了 Session 的使用。
理解 Cookie
Cookie 是 HTTP 头中的一个字段。当客户端通过 HTTP 访问服务端时,服务端会将一些 Key/Value 键值对返回给客户端,并加上一些限制条件,在条件符合后该客户端再次访问服务端时,数据又被完整地带回给服务端。也就是说,当请求某个 URL 路径时,浏览器会根据这个 URL 路径将符合条件的 Cookie 放在 Request 请求头中传回给服务端,服务端通过 request 对象的 getCookies 方法来取得所有 Cookie。'
Cookie 存储在浏览器里,不同的浏览器对 Cookie 的存储在大小和数量方面有一些限制。
理解 Session
同一个客户端每次和服务端交互时,不需要传回所有的 Cookie 值,只需传回一个 SessionID。这个 SessionID 是客户端第一次访问服务端时生成的,对于每个客户端而言是唯一的,通常是 NANE 为 JSESIONID 的一个 Cookie。
有了 SessionID,服务端就可以创建 HttpSession 对象了,第一次触发是通过 request 对象的 getSession 方法。
有 3 种方式可以让 Session 正常工作:
1 基于 URL 路径参数,默认支持。
2 基于 Cookie,默认支持。
3 基于 SSL,默认不支持,只有 connector.getAttribute("SSLEnabled") 为 TRUE 时才支持。
每个 Session 对象都有一个有效时间,超过这个时间后 Session 对象会被清除。在 Tomcat 中这个有效时间是 60s(通过 maxInactiveInterval 属性控制)。检查 Session 是否失效是在 Tomcat 的一个后台线程(backgroundProcess 方法中)中完成的。同时,调用 request 对象的 getSession 方法时也会检查该 Session 是否过期,如果 Session 过期了则会创建新的 Session 对象。如果不想自动创建 Session 对象,可以通过 request.getSession(boolean create) 方法来判断 Session 是否过期。
Cookie 安全问题
Cookie 与 Session 工作方式不同。Cookie 把数据通过 HTTP 头部从客户端传递给服务端,又从服务端传回给客户端,最终数据都存储在客户端的浏览器里,所以这些 Cookie 数据可以被访问,通过插件可以修改 Cookie,因此 Cookie 是不安全的。而 Session 是将数据保存在服务端,只是通过 Cookie 传递一个 SessionID,所以 Session 适合存储隐私数据。
参考资料
《深入分析 Java web 技术内幕》 P263-274
来源: http://www.bubuko.com/infodetail-2450724.html