首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>Java基础>正文

JSP/Servlet:Servlet/JSP会话跟踪机制

http://www.oklinux.cn  2008-02-28  赛迪网 huanglz   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

在Web服务器端编程中,会话状态管理是一个经常必须考虑的重要问题。本文分析JSP/Servlet的会话管理机制及其所面临的问题,然后提出了一种改进的会话管理方法。
一、Servlet的会话管理机制

根据设计,HTTP是一种无状态的协议。它意味着Web应用并不了解有关同一用户以前请求的信息。维持会话状态信息的方法之一是使用Servlet或者JSP容器提供的会话跟踪功能。Servlet API规范定义了一个简单的HttpSession接口,通过它我们可以方便地实现会话跟踪。

HttpSession接口提供了存储和返回标准会话属性的方法。标准会话属性如会话标识符、应用数据等,都以“名字-值”对的形式保存。简而言之,HttpSession接口提供了一种把对象保存到内存、在同一用户的后继请求中提取这些对象的标准办法。在会话中保存数据的方法是setAttribute(String s, Object o),从会话提取原来所保存对象的方法是getAttribute(String s)。

在HTTP协议中,当用户不再活动时不存在显式的终止信号。由于这个原因,我们不知道用户是否还要再次返回,如果不采取某种方法解决这个问题,内存中会积累起大量的HttpSession对象。

为此,Servlet采用“超时限制”的办法来判断用户是否还在访问:如果某个用户在一定的时间之内没有发出后继请求,则该用户的会话被作废,他的HttpSession对象被释放。会话的默认超时间隔由Servlet容器定义。这个值可以通过getMaxInactiveInterval方法获得,通过setMaxInactiveInterval方法修改,这些方法中的超时时间以秒计。如果会话的超时时间值设置成-1,则会话永不超时。Servlet可以通过getLastAccessedTime方法获得当前请求之前的最后一次访问时间。

要获得HttpSession对象,我们可以调用HttpServletRequest对象的getSession方法。为了正确地维持会话状态,我们必须在发送任何应答内容之前调用getSession方法。
用户会话既可以用手工方法作废,也可以自动作废。作废会话意味着从内存中删除HttpSession对象以及它的数据。例如,如果一定时间之内(默认30分钟)用户不再发送请求,Java Web Server自动地作废他的会话。

Servlet/JSP会话跟踪机制有着一定的局限,比如:

会话对象保存在内存之中,占用了可观的资源。

会话跟踪依赖于Cookie。由于各种原因,特别是安全上的原因,一些用户关闭了Cookie。

会话跟踪要用到服务器创建的会话标识符。在多个Web服务器以及多个JVM的环境中,Web服务器不能识别其他服务器创建的会话标识符,会话跟踪机制无法发挥作用。
要深入理解会话跟踪机制,首先我们必须理解在Servlet/JSP容器中会话如何运作。


二、会话标识符

每当新用户请求一个使用了HttpSession对象的JSP页面,JSP容器除了发回应答页面之外,它还要向浏览器发送一个特殊的数字。这个特殊的数字称为“会话标识符”,它是一个唯一的用户标识符。此后,HttpSession对象就驻留在内存之中,等待同一用户返回时再次调用它的方法。

在客户端,浏览器保存会话标识符,并在每一个后继请求中把这个会话标识符发送给服务器。会话标识符告诉JSP容器当前请求不是用户发出的第一个请求,服务器以前已经为该用户创建了HttpSession对象。此时,JSP容器不再为用户创建新的HttpSession对象,而是寻找具有相同会话标识符的HttpSession对象,然后建立该HttpSession对象和当前请求的关联。

会话标识符以Cookie的形式在服务器和浏览器之间传送。如果浏览器不支持Cookie又如何呢?此时,对服务器的后继请求将不会带有会话标识符。结果,JSP容器认为该请求来自一个新用户,它会再创建一个HttpSession对象,而以前创建的HttpSession对象仍旧驻留在内存中,但该用户以前的会话信息却丢失了。

另外,Servlet/JSP容器只认可它自己创建的会话标识符。如果同一Web应用在“Web农场”(Web farm)的多台服务器上运行,则必须存在这样一种机制:保证来自同一用户的请求总是被定向到处理该用户第一次请求的服务器。

三、伪会话管理机制

如前所述,基于Cookie的会话管理技术面临着种种问题。下面我们要设计一种新的会话管理机制来解决这些问题。这种会话管理机制称为“伪会话”(Pseudo Session)机制,它具有如下特点:

? 对象和数据不是保存在内存中,而是以文本文件形式保存。每一个文本文件与一个特定的用户关联,文件的名字就是会话的标识符。因此,文件名字必须是唯一的。
? 文本文件保存在一个专用的目录中,所有Web服务器都可以访问这个目录。因此,伪会话可以用于Web农场。
? 会话标识符不作为Cookie发送,而是直接编码到URL里面。因此,采用伪会话技术要求修改所有的超级链接,包括HTML表单的ACTION属性。
此外,实现伪会话管理机制时我们还要考虑到以下几点:
? 它应该与应用无关,其他想要实现同样功能的开发者应该能够方便地重用它。
? 考虑到安全原因,应该有一种为会话标识符生成随机数字的办法。
? 为了作废过期的会话,应该设定一个超时值。同一个用户,如果他超过一定的时间之后再次返回,他将获得一个新的会话标识符。此举能够防止未经授权的用户冒用其他人的会话。
? 应该有一种收集过期会话并删除相应文本文件的机制。
? 如果用户使用已经过期的会话标识符再次访问服务器,即使这个会话标识符的文本文件还没有删除,系统也不应该允许用户使用原来的会话。
? 同时,应该存在一种更新会话文本文件最后改动时间的机制,使得用户在会话过期时限之前返回时会话总是保持最新且合法的状态数据。


四、实现伪会话管理机制

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

共3页: 上一页 1 [2] [3] 下一页

上一篇:Opera抛弃Yahoo投入Google怀抱   下一篇:将Java程序部署到Linux上并让其定期执行

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Java GUI:在SWING中设计windowclosing()
·Java GUI--在Java中监控文本框的变化
·Java语言中四种XML解析技术之不完全测试
·进阶-使用浮点数和小数中的技巧和陷阱
·JAVA语言操作数据库方式与设计模式应用
·关于Java基础知识部分总结
·随便说说JAVA字符集和编码
·JAVA基础:Java/JSP中文乱码问题解决心得
·String中三种加法的区别
·关于int 和 String 互相转换的多种方法
·Java语言深入:C#与Java相似之处的对比
·Java语言深入--抽象类和接口的区别
·Java语言深入:浅析Java语言中的内部类
·高级:lucene全文检索应用示例及代码简析
·高手对 CLASSPATH 的详解
·基础:Java初学者都必须理解的六大问题
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java开发下的设计模式简单说明
·JAVA语言关于字符串替换的思考
·编写高级JavaScript应用代码
·常用的JDBC连接数据库方法大全
·解决JSP开发中Web程序中文显示三种方法
·对于Spring初学者的学习建议
·Java开发编程规范大分享
·站在巨人肩膀上学好J2EE全攻略
·Java网络编程基础(四) ServerSocket类
·Java网络编程基础(三) Datagram类使用
·Java学习过程中应该深入理解的一些重点
·Java网络编程基础(二) Socket类的使用
  阅读排行
·Java语言深入--java调用C/C 的过程
·一个非常有趣的使用spring框架AOP例子
·初学者Structs中基本配置入门
·使用AJAX技术实现网页无闪自动局部刷新
·关于java中相对路径,绝对路径问题总结
·JAVA基础:一个struts hibernate入门实
·高级:lucene全文检索应用示例及代码简
·一个基于Java Socket实现文件传输示例
·Hibernate配置文件中的映射元素详解
·关于角色访问控制(RBAC)
·快速教您Apache Tomcat SSL的配置
·使用WEBWORK实现文件上传方法实例详解
·JSP/Servlet:< jsp-config>标签使用详
·在struts里实现dtree通用树型结构讲解
·JSP JavaBean Servlet工作原理实例讲解
网摘收藏: