频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

解析Servlet/JSP会话跟踪机制

来源:中国IT实验室 作者:佚名 出处:巧巧读书 2008-03-06 进入讨论组

4.2、setValue方法

setValue方法保存value字符串以及与它关联的字符串名字。这种“名字-值”对很容易使人想起Dictionary对象。setValue方法要求在第一个参数中提供合法的会话标识符,它假定在自己被调用之前getSessionID方法已经执行,经过检验的合法会话标识符必然存在,因此它不再对传入的会话标识符进行合法性检验。

setValue方法按如下规则保存名字-值对:

如果与value值关联的name以前还没有保存过,则新的名字-值对加入到文本文件的末尾。

如果value字符串关联的name值以前已经保存过,则原来保存的值被新的value值替换。

setValue方法按照如下格式保存名字-值对,注意“名字”是大小写敏感的:

name-1 value-1name-2 value-2name-3 value-3...name-n value-n

setValue方法的声明如下:

public void setValue(String sessionId, String name, String value)

setValue方法首先寻找与当前会话对应的文本文件。如果不能找到文本文件,则setValue方法不做任何事情直接返回。如果找到了会话文本文件,setValue方法读取文本文件的各个行,然后比较读入的行与name:如果读入的文本行开头与name一样,则说明该名字已经保存,setValue方法将替换该行后面的值;如果name不能与读入的文本行匹配,则这行文本被直接复制到一个临时文件。

这部分功能的实现代码如下:

try { FileReader fr = new FileReader(path + sessionId);

BufferedReader br = new BufferedReader(fr); FileWriter

fw = new FileWriter(path + sessionId + ".tmp"); BufferedWriter

bw = new BufferedWriter(fw); String s; while ((s = br.readLine

()) != null)if (!s.startsWith(name + " ")) { bw.write(s);

bw.newLine();} bw.write(name + " " + value); bw.newLine();

bw.close(); br.close(); fw.close(); bw.close(); . . .}catch

(FileNotFoundException e)

{}catch (IOException e) { System.out.println(e.toString());}

原来文本文件中的所有行复制到临时文件之后,setValue方法删除原来的文本文件,然后把临时文件改成会话文本文件的名字:

File f = new File(path + sessionId + ".tmp");

File dest = new File(path + sessionId);

dest.delete();f.renameTo(dest);

4.3、getValue方法

getValue方法用于提取原来保存在伪会话中的数据。正如setValue方法,getValue方法也要求传入一个合法的会话标识符,而且getValue方法不再对传入的会话标识符进行合法性检查。getValue方法的第二个参数是待提取数据的name,返回值是与指定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教程专栏Jsp与Servlet专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章