设为首页
收藏本站
最近更新

文章搜索
本类热门

 

首页 >> 网络编程 >> JSP >> JSP技巧 >> 新闻正文 [字体:  ] [打印文档
深入理解和改进JSP/Servlet会话管理机制

文章作者:俞良松
责任编辑:gallop 录入时间:2005-1-5 21:52:37 来源:
频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意. 

返回值是与指定name关联的value。 

  getValue方法的声明如下: 

  public String getValue(String sessionId, String name)  

  getValue方法的基本执行过程如下:首先找到会话文本文件,然后按行读入直至找到与name匹配的文本行;找到匹配的文本行之后,getValue方法返回该行保存的value;如果不能找到,getValue方法返回null。 

  4.4 deleteAllInvalidSessions方法 

  deleteAllInvalidSessions方法删除那些与已经过期的会话关联的文本文件。由于调用getSessionID方法时过期的会话文本文件会被删除,deleteAllInvalidSessions方法并不是关键的方法。什么时候调用这个方法由应用自己决定。例如,我们可以编写一个专用的后台程序,由这个程序每天一次清除所有过期的文本文件。最简单的办法是在JSP文件末尾调用deleteAllInvalidSessions方法,但如果网站比较繁忙,重复地调用deleteAllInvalidSessions方法将降低整个网站的响应能力。一种明智的做法是:编写一个在访问量较少的时候自动进行清理的后台程序。 

  deleteAllInvalidSessions方法的声明如下: 

  public void deleteAllInvalidSessions()  

  它首先把所有会话文本文件的名字读入files字符串数组: 

  File dir = new File(path); String[] files = dir.list();  

  deleteAllInvalidSessions方法比较文本文件的最后修改时间(加上超时时间)和系统当前时间,确定会话是否过期。long类型的变量now用于保存系统的当前时间。 

long now = System.currentTimeMillis();  

  接下来,deleteAllInvalidSessions方法通过循环访问files数组,依次检查每个文件的lastModified属性。所有与过期会话关联的文件都将被删除:

for (int i=0; i<files.length; i++) { File f = new File(path + files[i]); if (f.lastModified() + timeOut > now) f.delete(); // 删除过期的会话文本文件}  
五、应用实例 
  编译好PseudoSessionBean这个JavaBean之后,我们就可以利用伪会话管理机制来管理Web应用的会话状态信息了。由于不必再使用服务器的会话管理机制,我们可以在page指令中把session属性设置为false关闭默认的JSP/Servlet会话管理功能。 

<%@ page session="false" %> 
然后,我们用JSP的<jsp:useBean>标记告诉JSP容器程序要使用PseudoSessionBean: 
<jsp:useBean id="PseudoSessionId" scope="application" 

class="pseudosession.PseudoSessionBean" />  

  在上面这个<jsp:useBean>标记中,class属性值是“包.类名字”形式。当然,对于不同的包名字,class属性的值应该作相应的修改。注意Bean的scope属性是“application”,这是因为我们要在应用的所有页面中使用这个Bean。在这个应用中,把Bean的scope属性设置为“application”具有最好的效率,因为我们只需创建Bean对象一次就可以了。另外,正如前面所提到的,getSessionID方法必须在所有其他代码之前调用。 

<% String sessionId = PseudoSessionId.getSessionID(request);%>  

  为了说明PseudoSessionBean的应用,下面我们来看两个JSP页面,它们是index.jsp和secondPage.jsp。index.jsp页面在伪会话变量中保存用户的名字,而secondPage.jsp则提取这个用户名字。 

  index.jsp页面的代码如下: 

<%@ page session="false" contentType="text/html;charset=gb2312" %><jsp:useBean id="PseudoSessionId" scope="application" 

class="pseudosession.PseudoSessionBean" /><% String sessionId = PseudoSessionId.getSessionID(request);%><html><head><title>伪会话</title></head><body><h1>伪会话管理机制</h1><br /><% String userName = "bulbul"; PseudoSessionId.setValue(sessionId, "userName", userName);%><a href=secondPage.jsp?sessionId=<%=sessionId%>>点击此处</a><br /><form method="post" action=anotherPage.jsp?sessionId=<%=sessionId%>><br />输入数据:<input type="text" name="sample"><br /><input type="submit" name="Submit" value="Submit"></form></body></html><% PseudoSessionId.deleteAllInvalidSessions();%>  

  注意,包括<form>标记的action属性在内,所有的超级链接都已经改写,现在都包含了会话标识符。另外也请注意页面的最后调用了deleteAllInvalidSessions方法。 

  secondPage.jsp页面只简单地返回以前保存的用户名字。 

<%@ contentType="text/html;charset=gb2312" page session="false" %><jsp:useBean id="PseudoSessionId" scope="application" 

class="pseudosession.PseudoSessionBean" /><% String sessionId = PseudoSessionId.getSessionID(request);%><html><head><title>第2个页面</title></head><body><% String userName = PseudoSessionId.getValue(sessionId, "userName"); out.println("用户名字是 " + userName);%></body></html>  

此新闻共有3页 上一页 1 2 3 下一页

推荐好友 | 频道收藏 | 打印文档 | 报告错误  
相关连接
·通过Jsp发送动态图像
·用JSP创建可重用的图形背景
·用JSP+Servlet实现二进制图像的动态显示
·利用weblogic的POOL(连接池)连接数据库
·深入理解和改进JSP/Servlet会话管理机制
·JSP和Struts解决用户退出问题
·JSP彩色验证码
·改变JSP的文件后缀
同一专题
·无相关专题
发表评论 版权声明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有
转载
要求转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。
共有评论查看评论
姓名: