Session知识讲解
Session的讲解
昨天我们讲解了Cookie的原理及应用,那么我们今天来讲解一下Session。
首先我们先来说一下什么是session:
我们在使用Cookie和附加URL参数来传递上一次请求状态信息时,如果传递的状态信息较多时将会极大降低网络传输效率和增大服务器端程序处理的难度。这时我们就可以用Session技术。
Session技术是一种将会话状态保存在服务器端的技术,客户端需要接收、记忆和回送Session的会话标识号,Session可以且经常是借助Cookie来传递会话标识号。
它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式。
对于Session我们已经简单的给大家介绍了一点,下面我们在来进一步讲解Session的跟踪机制:
在Servlet API规范中定义了一个HttpSession接口,HttpSession接口定义了各种管理和操作会话状态的方法。HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。
WEB服务器并不会在客户端开始访问它时就创建HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序时,WEB应用程序才会创建一个与客户端对应的HttpSession对象。WEB服务器为HttpSession对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端,客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给WEB服务器,WEB服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。在WEB服务器创建了与某个客户端对应的HttpSession对象后,只要没有超出一个限定的空闲时间段,HttpSession对象就驻留在WEB服务器内存之中,该客户端此后访问任意的Servlet程序时,它们都使用与客户端对应的那个已存在的HttpSession对象。
在HttpSession接口中专门定义了一个setAttribute方法来将对象存储到HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。
Session是实现网上商城的购物车的最佳方案,存储在某个客户Session中的一个集合对象就可充当该客户的一个购物车。
上面我们介绍了Session的跟踪机制,在里面我们说到了HttpSession接口,那么我们就来说说HttpSession接口中所拥有的方法:
getId方法,getCreationTime方法,getLastAccessedTime方法
,setMaxInactiveInterval方法,getMaxInactiveInterval方法,
isNew方法:
如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。
invalidate方法,getServletContext方法,setAttribute方法,
getAttribute方法,removeAttribute方法,getAttributeNames方法
getSession方法 :
public HttpSession getSession(boolean create)
public HttpSession getSession()
isRequestedSessionIdValid方法
isRequestedSessionIdFromCookie方法
isRequestedSessionIdFromURL方法
我们说完了HttpSession接口里的方法,我们接着说一下Session中的超时管理:
当我们在浏览资源时,WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象,随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。所以WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
那么会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
我们说到Session便想到与Session相类似的application对象,Application对象用于存储和访问来自任何页面的变量,不同于Session之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。
下面是Application的域范围的属性图:
Session的域范围的属性图:
通过上图我们可以看出Session 与Application的不同之处,我们再通过它们的实践来比较一下它们的区别:
HttpSession session = request.getSession();
Integer sessionCount = (Integer)session.getAttribute("count");
int count = 0;
if(sessionCount != null)
{
count = sessionCount.intValue();
}
out.println("当前会话中发生了" + (++count) + "次访问<br>");
session.setAttribute("count",new Integer(count));
count = 0;
ServletContext application = getServletContext();
Integer applicationCount = (Integer)application.getAttribute("count");
if(applicationCount != null)
{
count = applicationCount.intValue();
}
out.println("WEB应用程序中发生了" + (++count) + "次访问<br>");
application.setAttribute("count",new Integer(count));
我们说完了Application与Session的区别,我们再了解一下利用Cookie实现Session跟踪:
如果WEB服务器处理某个访问请求时创建了新的HttpSession对象,它将把会话标识号作为一个Cookie项加入到响应消息中,通常情况下,浏览器在随后发出的访问请求中又将会话标识号以Cookie的形式回传给WEB服务器。WEB服务器端程序依据回传的会话标识号就知道以前已经为该客户端创建了HttpSession对象,不必再为该客户端创建新的HttpSession对象,而是直接使用与该会话标识号匹配的HttpSession对象,通过这种方式就实现了对同一个客户端的会话状态的跟踪。
利用URL重写实现Session跟踪:
Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数。
将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写。
HttpServletResponse接口中定义了两个用于完成URL重写方法:
encodeURL方法 和encodeRedirectURL方法。
关于Session的知识大致的就是这样,我们今天就说到这。
摘自 雪狼小记
补充:Web开发 , 其他 ,