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窗口浏览器是没有关系的。

 

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

 

 

 

 

 

你可能感兴趣的:(servlet)