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

文章搜索
本类热门

 

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

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

meter("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方法。 

  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,

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

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