Tomcat与JavaWeb开发技术详解HTTP会话的使用与管理第九章

由于本人的阅读能力有限,初次读这一章的内容感觉就是有些云里雾里,于是,结合书中的知识,在网上找了一些资料,我在此先对Session的知识做些总结,接而再对课本内容进行总结。

Session对象:

1.什么是session?

session是一种会话管理技术,session用来保存会话过程中的数据,保存的数据存储到服务器端。

session原理:基于cookie实现的,更确切的说是基于会话级别的cookie实现的。

2.HttpSession API

session常用方法:

>>>1.得到session的id(JESSIONID对应的值):getId();

>>>2.设置session的生命时长:setMaxInactiveInterval(int interval)

>>>3.销毁session:invalidate();

>>>4. 得到session: HttpSession session=getSession();

session域对象:作用范围一次完整的会话(包含多个请求)

>>>1.存值:setAttribute(String key,Object obj);

>>>2.取值:Object obj=getAttribute(String key);

>>>3.移除: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的工作流程大致如下:


9.1会话简介

会话指的是再一段时间内,单个客户与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对象。

9.2HttpSession的生命周期及会话范围

会话范围是指浏览器与一个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应用的任一网页

9.3使用会话的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");

}

%>

9.4使用会话的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()(序列化)接口,了解一下。

9.5通过重写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")>">

9.6会话的持久化

会话的持久化有两个好处:1.节约内存空间 2.确保在服务器重启或单个Web应用重启后,能恢复重启前的会话。



Tomcat采用会话管理器来管理会话,其中包括两种:1.标准会话管理器 2.PersistenManager类提供更多的管理会话的功能

9.7会话的监听

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):搁置前调用

9.7.1用HttpSessionListener统计在线人数:

Web应用的当前所有会话数目就等于在线用户数量

9.7.2用HttpSessionBingdingListener统计在线人数

User类实现了HttpSessionBingdingListener接口的valueBound()方法和valueUnbound()方法


                                                                                                                                          2018.07.11





猜你喜欢

转载自blog.csdn.net/qq_40369435/article/details/81002116
今日推荐