Session

来源:互联网 发布:电脑消毒软件 编辑:程序博客网 时间:2024/04/27 22:18

在Web开发领域,会话机制是用于跟踪客户状态的普遍解决方案。会话指的是在一段时间内,单个客户与Web应用的一连串相关的交互过程。在一个会话中,客户可能会多次请求访问Web应用的同一个网页,也有可能请求访问同一个Web应用中的多个网页。

1. 什么是Session

在服务器端维护用户状态的一种状态管理技术。浏览器访问服务器时,服务器会创建一个对象(Session对象),同时还会生成一个标识该对象的唯一的字符串(SessionID),服务器在默认情况下,使用Cookie机制将SessionID发送给浏览器。浏览器在下次访问服务器时,会将SessionID携带给服务器,服务器使用SessionID查找对应的Session对象。通过这种方式来维护用户的状态。

Servlet规范制定了基于Java的会话的具体的运作机制。在Servlet API中定义了代表会话的javax.servlet.http.HttpSession接口,Servlet容器必须实现这一接口。当一个会话开始时,Servlet容器将创建一个HttpSession对象,在该对象中可以存放表示客户状态的信息(比如购物车)。Servlet容器为每个HttpSession对象分配一个唯一标识符,称为SessionID。

下面以亚马逊之类的购物网站为例,介绍会话的运作流程:

1. 一个浏览器进程第一次请求访问Amazon的任意一个支持会话的网页,Servlet容器试图寻找Http请求中表示SessionID的Cookie,由于还不存在这样的Cookie,因此就认为一个新的会话开始了,于是创建一个HttpSession对象(存放在服务器端的内存里),并为它分配唯一的SessionID,然后把SessionID作为Cookie添加到Http响应结果中。当浏览器接收到Http响应结果后,会把其中表示SessionID的Cookie保存在浏览器的内存里。2. 浏览器进程继续请求访问Amazon的任意一个支持会话的网页,在本次Http请求中会携带表示SessionID的Cookie,由于能得到这样的Cookie,因此认为本次请求已经处于一个会话中了,Servlet容器不再创建新的HttpSession对象,而是从Cookie中获取SessionID,然后根据SessionID找到内存中对应的HttpSession对象。3. 浏览器进程重复步骤二,直到当前会话被销毁,HttpSession对象就会结束生命周期。
如果一个Web组件支持会话,就意味着:

1. 当客户请求访问该Web组件时,Servlet容器会自动查找Http请求中表示SessionID的Cookie,以及向Http响应结果中添加表示SessionID的Cookie,Servlet容器还会创建新的HttpSession对象或者寻找已经存在的与SessionID对应的HttpSession对象。2. Web组件可以访问代表当前会话的HttpSession对象。
2. Session的创建

JSP文件在默认情况下就支持会话,session是JSP的内置对象,可以直接使用而无需先创建。

HttpServlet类在默认情况下不支持会话,这是HttpServlet与JSP的一个小小区别。

那么在HttpServlet类中如何支持会话,并且如何获得HttpSession对象呢?

当Servlet容器调用HttpServlet类的服务方法时,会传递一个HttpServletRequest类型的参数,HttpServlet可通过HttpServletRequest对象来获得HttpSession对象。

方式一: HttpSession request.getSession();方式二: HttpSession request.getSession(boolean flag);
对于方式二:

1. flag为true:服务器查看请求中是否有sessionId,如果没有,则创建一个session对象,并返回该对象的引用。如果有,要根据sessionID查看对应的session对象是否存在,如果存在,则返回该对象的引用,若不存在,则创建一个session对象。2. flag为false时:服务器查看请求中是否有sessionId, 如果没有,返回null。如果有,则根据sessionID查看对应的session对象是否存在,如果存在,则返回该对象的引用,若不存在,返回null。
request.getSession()与request.getSession(true)等价。根据官方的说法,request.getSession()仅仅是因为书写简洁,别无他意!

3.HttpSession接口的常用方法

1. String getId()2. void invalidate():销毁当前会话3. void setAttribute(String name,Object obj)4. Object getAttribute(String name)5. Enumeration getAttributeNames()6. void removeAttribute(String name)7. boolean isNew()8. void setMaxInactiveInterval(int interval)9. int getMaxInactiveInterval()10. ServletContext getServletContext()
4. session过期

会话过期是指当会话开始后,如果在一段时间内,客户端一直没有和Web应用交互,即一直没有请求访问Web应用中的支持会话的任意一个网页,那么Servlet容器会自动销毁这个会话。HttpSession类的setMaxInactiveInterval(int interval)方法用于设置允许会话保持不活动状态的时间(以秒为单位)。如果超过这一时间,会话就会被销毁。如果把参数interval设置为负数,就表示会话永远不会过期。Tomcat服务器为会话设置的默认的保持不活动状态的的最长时间为半个小时。在tomcat_home \ conf \ web.xml中:

<session-config><session-timeout>30</session-timeout></session-config>
这里的设置是针对所有部署在Tomcat上的应用而言。如果只想针对某个应用设置最大不活动时间,修改WEB-INF\web.xml文件。

注意一个问题:

当一个会话开始后,如果浏览器进程突然关闭,Servlet容器显然无法立即知道浏览器进程已经关闭,因此Servlet容器端的HttpSession对象不会立即结束生命周期。不过,当浏览器进程关闭后,这个会话就进入不活动状态,等到超过了setMaxInactiveInterval(int interval)方法设置的时间,会话就会因为过期而被Servlet容器销毁。



原创粉丝点击