文章目录
由于本人的阅读能力有限,初次读这一章的内容感觉就是有些云里雾里,于是,结合书中的知识,在网上找了一些资料,我在此先对Session的知识做些总结,接而再对课本内容进行总结。
什么是session?
session是一种会话管理技术,session用来保存会话过程中的数据,保存的数据存储到服务器端。
session原理:
基于cookie实现的,更确切的说是基于会话级别的cookie实现的。
HttpSession API
session常用方法:
-
得到session的id(JESSIONID对应的值):getId();
-
设置session的生命时长:setMaxInactiveInterval(int interval)
-
销毁session:invalidate();
-
得到session: HttpSession session=getSession();
session域对象:作用范围一次完整的会话(包含多个请求)
-
存值:setAttribute(String key,Object obj);
-
取值:Object obj=getAttribute(String key);
-
移除:removeAttribute(String key);
总结域对象:
- ServletContext域对象>session域对象>request域对象
request域对象:
- 作用范围一次请求,通常和转发操作配合使用
session域对象:
- 作用范围一次会话,通常和重定向配合使用
ServletContext域对象:
- 作用范围整个项目,和重定向,转发操作都可以配合使用
Session超时管理
session对象是由生命时长,它的默认存活时间是30分钟
具体配置找tomcat软件下的web.xml文件,如下:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
立即销毁session对象:
invalidate()
session的工作流程大致如下:
会话简介
会话指的是再一段时间内,单个客户与Web应用的一连串相关的交互过程。
一个浏览器进程第一次访问Web应用中的任意一个支持会话的网页,Servlet容器试图寻找HTTP请求中表示SessionID的Cookie,因此就认为一个新的会话开始了,于是创建一个HttpSession对象,为它分配唯一的SessionID,然后把SessionID作为Cookie添加到HTTP响应结果中。当浏览器接收到HTTP响应结果后,会把其中表示SessionID的Cookie保存在服务器中。
浏览器继续访问Web应用中任意一个支持会话的网页,在本次HTTP请求中会包含表示SessionID的Cookie,Servlet容器试图寻找HTTP请求中表示SessionID的Cookie,由于能得到这样的Cookie,因此认为本次请求已经处于一个会话中了,Servlet不再创建新的HttpServlet对象,而是从Cookie中获取SessionID,然后根据SessionID找到内存中对应的HttpSession对象。
HttpSession的生命周期及会话范围
会话范围是指浏览器与一个Web应用进行一次会话的过程,会话范围与HttpSession对象的生命周期对应。
Web应用中的JSP或Servlet组件可通过这些方法访问会话:
-
getId():返回SessionID
-
invalidate():销毁当前对话,Servlet容器会释放HttpSession对象所占用的资源
-
setAttribute(String name,Object obj):将一对name/value属性保存在HttpSession对象中
-
getAttribute(String name):根据name参数返回保存在HttpSession对象中的属性值
-
removeAttribute(String name):从HttpSession对象中删除name参数的属性
-
isNew():判断是否新创建的会话。如果是返回true,否则返回false
-
setMaxInactiveInterval(int interval):设置一个会话可以处于不活动状态的最长时间,以秒为单位。如果设置参数为负数,,会话将永远不会过期。
-
getMaxInactiveInterval():读取当前会话可以处于不活动的最长时间
-
getServletContext():返回会话所属的Web应用的ServletContext对象
以下情况会开始新的会话,即创建新的HttpSession对象:
-
一个浏览器进程第一次访问Web应用中的支持会话的任意网页。
-
当前浏览器进程与Web应用的一次会话已经被销毁后,浏览器再次访问Web应用的任一网页
使用会话的JSP范例程序
以下JSP代码把用户名信息存放在会话范围内:
<%
<%session.setAttribute("username",name); %>
if(!session.isNew()){
name=(String)session.getAttribute("username");
if(name==null)name="";
}
String name=null;
name=request.getParameter("username");
if(name!=null)
session.getAttribute("username",name);
else {
name=(String) session.getAttribute("username");
if(name==null)
response.sendRedirect("maillogin.jsp");
}
%>
使用会话的Servlet范例程序
Jsp文件在默认情况下都支持会话,而HttpServlet类在默认情况下不支持会话,这是JSP与HttpServlet的一个小小区别
在HttpServletRequest接口中提供了两个与会话有关的方法:
-
getSession():使得当前HttpServlet支持会话。
-
getSession():如果参数为true,等价于调用HttpServletRequest()的getSession()方法
代码示例:
HttpSession session=request.getSession(true);
ShoppingCart cart=(ShoppingCart)session.getAttribute("cart");
if(cart==null){
cart=new ShoppingCart();
session.setAttribute("cart",cart);
}
书中例子用到HashMap<String ,Integer>,以及Serializable()(序列化)接口,了解一下。
通过重写URL来跟踪会话
如果浏览器支持Cookie,Servlet容器就把SessionID作为Cookie保存在浏览器中,如果不支持Cookie,本章将介绍跟踪会话的另一种方式。
如果浏览器不支持Cookie,Servlet容器可以重写Web组件的URL,把sessionID添加到URL信息中。HttpServletRequest提供了重写URL的方法:
public java.lang.String encodeURL(String url)
例如
修改前
<a href="maillogin.jsp">
修改后
<a href="<= response.encodeURL("maillogin.jsp")>">
会话的持久化
会话的持久化有两个好处:1.节约内存空间 2.确保在服务器重启或单个Web应用重启后,能恢复重启前的会话。
Tomcat采用会话管理器来管理会话,其中包括两种:
- 标准会话管理器
- PersistenManager类提供更多的管理会话的功能
会话的监听
Servlet API中定义了4个用于监听会话中的各种时间的监听器接口:
(1)HttpSessionListener
接口:监听创建会话及销毁会话的事件,它有两个方法:
- sessionCreated(HttpSessionEvent event)当Servlet容器创建了一个会话后,会调用此方法
- sessionDestroyed(HttpSessionEvent event)当Servlet容器将要销毁一个会话之前,会调用此方法
(2)HttpSessionAttributeListener
接口:监听向会话中加入属性,替换属性,和删除属性的事件,有如下三个方法。
- attributeAdded(HttpSessionBindingEvent event)
- attributeRemoved(HttpSessionBindingEvent event)
- attributeReplaced(HttpSessionBinding event)
(3)HttpSessionBindingListener接口
:监听会话与一个属性绑定或解除绑定的事件
- valueBound(HttpSessionBindingEvent event):当Web应用把一个属性与会话绑定后,Servlet会调用此方法
- valueUnbound(HttpSessionBindingEvent event):当Web应用将要把一个属性与一个会话解除绑定之前会调用此方法
(4)HttpSessionActivationListener
接口:监听会话被激活和被搁置的事件,它有两个方法:
- sessionDidActivate(HttpSessionEvent event):激活后调用
- sessionWILLPassivate(HttpSessionEvent event):搁置前调用
用HttpSessionListener统计在线人数:
Web应用的当前所有会话数目就等于在线用户数量
用HttpSessionBingdingListener统计在线人数
User类实现了HttpSessionBingdingListener接口的valueBound()方法和valueUnbound()方法