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

解析Servlet/JSP会话跟踪机制

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

四、实现伪会话管理机制

下面所介绍的工程称为PseudoSession,它是伪会话机制一个很简单的实现。考虑到移植性,我们以JavaBean的形式实现它。PseudoSessionBean的完整代码可以从本文后面下载。

PseudoSessionBean拥有如下域(Field):

public String path;public long timeOut;

path是保存所有会话文本文件的目录。如果Web服务器的数量在一个以上,这个目录必须允许所有服务器访问。然而,为了防止用户直接访问这些文本文件,这个路径应该不允许用户直接访问。解决这个问题的一种方法是使用Web网站根之外的目录。

timeOut是用户的最后一个请求到会话过期作废之间的时间。在PseudoSessionBean的代码清单中,timeOut设置成了以毫秒表示的20分钟,这是一个比较合理的超时时间值。对于任何用户,如果他在这个超时时间之后才继续发出请求,他将得到一个新的会话标识符。

PseudoSessionBean有4个方法:getSessionID,setValue,getValue,deleteAllInvalidSessions。

4.1、getSessionID方法

getSessionID方法的声明如下:

public String getSessionID(HttpServletRequest request)

这个方法应该在每一个JSP页面的开头调用。它完成如下任务:

如果用户是第一次访问,则为该用户设定一个新的会话标识符。

检查URL所带会话标识符的合法性。如果会话标识符已经过期,则getSessionID方法返回一个新的会话标识符。

下面我们来看看getSessionID方法的工作过程。

String sessionId = request.getParameter("sessionId");

validSessionIdFound是一个标记,用于指示会话标识符是否合法。validSessionIdFound的初始值是false。

boolean validSessionIdFound = false;

long类型的now变量包含请求出现时的服务器时间。该变量用于确定用户会话的合法性。

long now = System.currentTimeMillis();

如果找到了会话标识符,则getSessionID方法检查它的合法性。检查过程如下:

一个合法的会话标识符必须有对应的同名文本文件。文件的最后修改时间加上timeOut应该大于当前时间。

如果存在与会话对应的文本文件,但文件已经过期,则原来的文件被删除。

把合法会话标识符所对应文本文件的最后修改日期改为now。

这些任务主要借助File对象完成,创建File对象的参数就是会话文本文件的路径:

if (sessionId!=null) {
File f = new File(path + sessionId);
if (f.exists()) {
if (f.lastModified() + timeOut > now)
{
// 会话合法
// 使用setLastModified时,如果文件已经被其他程序锁定,
// 程序不会产生任何异常,但文件数据不会改变
f.setLastModified(now);
validSessionIdFound = true;
}
else
{
// 会话已经过期
// 删除文件
f.delete(); }}
//
end if (f.exists) }
//
end if (sessionId!=null)

如果不存在合法的会话标识符,则getSessionID方法生成一个会话标识符以及相应的文本文件:

if (!validSessionIdFound) { sessionId = Long.toString(now); // 创建文件

File f = new File(path + sessionId); try {f.createNewFile(); }

catch (IOException ioe) {}} // end of if !validSessionIdFound

程序保证文件名字随机性的方法非常简单:把当前的系统时间直接转换成会话标识符。对于那些涉及敏感数据的应用,我们应该考虑运用更安全的随机数生成器来生成会话标识符。

综上所述,getSessionID并不总是返回新的合法会话标识符:它返回的标识符可能与传递给它的标识符相同,也可能是新创建的会话标识符。

为了保证JSP页面拥有合法的会话标识符以便调用setValue、getValue方法,每个JSP页面都必须在开头位置调用getSesstionID方法。

更多文章 更多内容请看Jsp完全攻略专题JSP教程专栏Jsp与Servlet专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章