Servlet学习整理(六)——session

session简介

http是一个无状态的协议,为了实现与特定客户端的会话通信,servlet提供了session会话跟踪机制,为此提供了一个简单的HttpSession接口供开发者调用实现。

session的会话跟踪机制

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的存在时,它被认为是一个新的session;

servlet设计者必须考虑到客户端不能加入session的情况。

session的范围

HttpSession对象的作用域是应用级别的;

虽然用于session的cookie可以服务于不同的上下文,但一个HttpSession实例只服务于一个会话。

例如:一个servlet A用RequestDispatcher去调用另一个web应用中的另一个servlet B,用于A和B的session一定是两个不同的session。

session中绑定参数

servlet可以通过一个name将对象绑定到session中。

在同一个servletContext中的处理同一个请求的其他servlet对session中绑定的对象都是可见的。

实现接口HttpSessionBindingListener的对象可以获得对象在session中绑定或删除的通知信息。

主要方法是:

  • valueBound
  • valueUnbound

session超时

在http协议中,没有一个明确的信号来标识客户端是否有效。所以只能使用超时作为验证客户端有效的机制。

默认的超时时间是servlet容器设定的,可以通过HttpSession接口的getMaxInactiveInterval方法来获取,也可以使用setMaxInactiveInterval方法自定义设置。

超时时间是以秒为单位的,如果设置为-1,那么session永不过期。

当调用session的所有servlet都退出service方法后,这个session就被认定为失效的,后续新的请求都不能再使用它。

最后访问时间

在当前的请求中用HttpSession接口的getLastAccessedTime可以获得最后一次访问session的时间。

重要的会话语义

线程问题

多线程的请求处理可能同时引用的同一个session对象,开发者要注意session的同步问题。

分布式环境

分布式的应用中,一个session的多个请求必须一次被同一个jvm处理。

容器必须能够处理所有通过setAttribute和putValue设置到session的对象。

为此,需要有下面的限制条件:

  • 容器必须能够访问实现了Serializable接口的对象
  • 容器可以选择存储session中指定的对象
  • session的迁移必须由容器特殊设备来处理

客户端语义

由于cookies或SSL证书都是被web浏览器访问过程控制的,与任何特殊的window窗口浏览器是没有关系的。

从客户端的窗口发出的请求可能是同一个会话,所以开发者可以认定从客户端窗口访问的请求可以作为同一个会话。

猜你喜欢

转载自wade6.iteye.com/blog/1748740