http是一个无状态的协议,为了实现与特定客户端的会话通信,servlet提供了session会话跟踪机制,为此提供了一个简单的HttpSession接口供开发者调用实现。
Cookies
session的会话跟踪机制少不了http cookies的帮助。
容器发送一个cookie到客户端,客户端会记录cookie,客户端再次访问相同地址的时候会把保存的cookie返回给服务器。通过在cookie中增加一个唯一的标识属性即可实现会话跟踪的机制。
通常在cookie中增加JESSIONID作为这个唯一标识,其值是容器产生的一个唯一id。
SSL Sessions
在安全套接字层,HTTPS协议使用加密技术,使用一个客户端的多个请求作为session的一部分,然后servlet容器使用这些请求的数据来生成一个session。
URL 重写(我觉得叫 URL参数冗余 比较合适)
URL重写是最低性能的会话跟踪机制。
当客户端不接受cookie时,URL可能会作为一个基本的会话跟踪。
URL重写包括一个附加的数据,一个session id,这样的URL会被引擎解析和一个session相关联。
session id必须经过编码,作为URL中的路径参数,参数的名字必须是jsessionid。
例如:
http://www.myserver.com/catalog/index.html;jsessionid=1234
会话的完整性
当客户端不支持使用cookie的时候,web容器必须支持HTTP的session机制,所以web容器一般要支持URL重写机制。
当客户端不知道这个session的存在时,它被认为是一个新的session;
servlet设计者必须考虑到客户端不能加入session的情况。
HttpSession对象的作用域是应用级别的;
虽然用于session的cookie可以服务于不同的上下文,但一个HttpSession实例只服务于一个会话。
例如:一个servlet A用RequestDispatcher去调用另一个web应用中的另一个servlet B,用于A和B的session一定是两个不同的session。
servlet可以通过一个name将对象绑定到session中。
在同一个servletContext中的处理同一个请求的其他servlet对session中绑定的对象都是可见的。
实现接口HttpSessionBindingListener的对象可以获得对象在session中绑定或删除的通知信息。
主要方法是:
在http协议中,没有一个明确的信号来标识客户端是否有效。所以只能使用超时作为验证客户端有效的机制。
默认的超时时间是servlet容器设定的,可以通过HttpSession接口的getMaxInactiveInterval方法来获取,也可以使用setMaxInactiveInterval方法自定义设置。
超时时间是以秒为单位的,如果设置为-1,那么session永不过期。
当调用session的所有servlet都退出service方法后,这个session就被认定为失效的,后续新的请求都不能再使用它。
在当前的请求中用HttpSession接口的getLastAccessedTime可以获得最后一次访问session的时间。
线程问题
多线程的请求处理可能同时引用的同一个session对象,开发者要注意session的同步问题。
分布式环境
分布式的应用中,一个session的多个请求必须一次被同一个jvm处理。
容器必须能够处理所有通过setAttribute和putValue设置到session的对象。
为此,需要有下面的限制条件:
客户端语义
由于cookies或SSL证书都是被web浏览器访问过程控制的,与任何特殊的window窗口浏览器是没有关系的。
从客户端的窗口发出的请求可能是同一个会话,所以开发者可以认定从客户端窗口访问的请求可以作为同一个会话。