`
ywg2008
  • 浏览: 45477 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Web开发Struts:Session对象创建和控制

阅读更多

首先谈一下session对象在web开发中的创建以及sessionId生成并返回客户端的运行机制。

session对象当客户端首次访问时,创建一个新的session对象。并同时生成一个sessionId,并在此次响应中将sessionId 以响应报文的方式返回客户端浏览器内存或以重写url方式送回客户端,来保持整个会话,只要sever端的这个session对象没有销毁,以后再调用 request.getSession()时就直接根据客户端的sessionId来检索server端生成的session对象并返回,不会再次去新 建,除非根据此sessionId没有检索到session对象。

下面是在IE下测试,因为IE 6.0的一个BUG就是IE的隐私设置。即使是阻止所有cookie时,也还是会以会话cookie来保存sessionId。所以下面都是以会话cookie来讨论的。

(1)在server没有关闭,并在session对象销毁时间内,当客户端再次来请求server端的servlet或jsp时,将会将在第一次 请求时生成的sessionId并附带在请求信息头中并向server端发送,server端收到sessionId后根据此sessionId会去搜索 (此过程是透明的)server对应的session对象并直接返回这个session对象,此时不会重新去建立一个新的session对象。

(2)当server关闭(之前产生的session对象也就消亡了),或session对象过了其销毁时间后,浏览器窗口不关,并在本浏览器窗口 再次去请求sever端的servlet和jsp时,此时同样会将sessionId(server关闭或session销毁时生成的 sessionId)发送到server端,server根据sessionId去找其对应的session对象,但此时session对象已经不存在, 此时会重新生成一个新的session对象,并生成新的sessionId并同样将这个新生成的sessionId以响应报文的形式送到浏览器内存中。

(3)当server没有关闭,并session对象在其销毁时间内,当请求一个jsp页面回客户端后,关闭此浏览器窗口,此时其内存中的 sessionId也就随之销毁,在重新去请求sever端的servlet或jsp时,会重新生成一个sessionId给客户端浏览器,并存在浏览内 存中。

上面的理论在servlet中测试都是成立的,下面谈一下在struts框架下进行上面的测试时的不同的地方。

先简要说下测试程序的流程:

客户端请求index.do--->进入server端的IndexAction--->转向login.jsp页面----->请求login.do----->进入server端的LoginAction。

首先说明:IndexAction中没有去产生session对象,login.jsp中设置。

(1)环境servlet+jsp

在sevlet+jsp测试跟踪时,在index.do进入IndexAction后转向login.jsp时,此时浏览器内存中是没有会话 cookie的,那么在login.jsp上请求login.do进入LoginAction后,用request.getCookies()测试时,其 值是为null的!结果是吻合的,因为从始至终没有产生过session。

(2)环境struts+jsp

在struts+jsp测试跟踪时,跟上面的流程一样,开始想结果也应该是一样的,但经过调试后发现结果却不是所想的那样。在login.do进入 LoginActoin后用,用request.getCookies()测试时,发现其值不为null,即使有name和value,开始很不理解,因 为根本就没有创建过session对象,哪来的会话cookie值呢!但是结果有,那么想着此时浏览器内存中也就应该有会话cookie,问题就在这里! 从哪里来的?

后来经过仔细考虑后,想到struts中的特点,我们自己写的Action类是继承struts的Action的,而且之前是经过struts的中 央控制器ActionServlet来控制转向的,所以我想肯定是在程序进入我自己写的IndexAction之前,struts框架中的代码肯定已经创 建了session对象并已经生成了sessionId。于是就找到相关书籍查看了ActionServlet工作流程以及调用哪些类,看了之后果然在其 中看到了HttpSession session = request.getSession();这样一句话!于是答案也就明白了。

大家知道struts的ActionServlet类中在接收到我们客户端的请求(*.do)后(之前会做一系列初始化工作),并不是直接去处理我 们的请求并调用相应的Action(我们写的如IndexAction),而是将处理工作交给RequestProcessor类,其process方法 中会调用一系列的方法来完成相应的请求处理和转向操作。其中有一个方法引起了我的关注,就是processLocale()方法。

Struts框架:RequestProcess类中的processLocale()方法,原型如下:


protected void processLocale(HttpServletRequest request,
		HttpServletResponse response) {
	// Are we configured to select the Locale automatically?
	if (!moduleConfig.getControllerConfig().getLocale())
		// Has a Locale already been selected?
		HttpSession session = request.getSession();

	if (session.getAttribute(Globals.LOCALE_KEY) != null)
		// Use the Locale returned by the servlet container (if any)
		Locale locale = request.getLocale();
	if (locale != null) {
		if (log.isDebugEnabled()) {
			log.debug(" Setting user locale '" + locale + "'");
		}
		session.setAttribute(Globals.LOCALE_KEY, locale);
	}
}
 

此类在struts-config.xml配置文件中有对应的配置项:< controller locale="true">< /controller>其缺省状态locale属性的值为true,也就会调用processLocale方法,并在第一次请求时创建 session对象和生成sessionId。但改为false后,在第一次请求到达ActionServlet后不会调用processLocale方 法,也就不会生成session对象了。

结果也就出来了,在struts应用中,*.do到达server端后经过ActionServlet后转想我们自己写的IndexAction之 前,< controller locale="true">< /controller>(缺省状态)时,就已经产生了session对象和sessionId,这是struts框架类中生成的,即使我们在 IndexAction中写上HttpSession session = request.getSession();其也是RequestProcess类中的processLocale()方法生成的,此时其session 的isNew也还是true,因为还没有返回客户端,其是新创建的,那么按照上面的流程,当在login.jsp上通过login.do进入 LoginAction后,其request.getCookies()固然也就有值了!并且其值是RequestProcess类中的 processLocale()方法产生session对象时生成的。

如果我们在struts-config.xml中加上< controller locale="false">< /controller>时,此时如果再根据上面的流程来跟踪程序,并在LoginAction用request.getCookies()测试 时,其值是为null的,当然在IndexAction写上HttpSession session = request.getSession();时其是进入IndexAction时新创建的,isNew也是true。

分享到:
评论

相关推荐

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》重点讲解了Struts 2、Speing和HIbernate框架的基础知识和高级技术,如Sruts 2中的*、类型转换、国际化和标签等,HIbe rna{e的会话、0/R映射和...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》重点讲解了Struts 2、Speing和HIbernate框架的基础知识和高级技术,如Sruts 2中的*、类型转换、国际化和标签等,HIbe rna{e的会话、0/R映射和...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 ...

    李兴华Java Web开发实战经典(高清版) Part2

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 ...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

    java web 视频、电子书、源码(李兴华老师出版)

    6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 ...

    《Java Web开发》实验教学大纲2018

    MyEclipse+Tomcat开发环境的安装与配置、HTML+CSS+JavaScript页面的设计、Servlet的应用测试、Cookie对象与Session对象的应用、JSP的基本语法练习、EL表达式和JSTL标签库的应用、MySQL数据库与表格的创建和访问、用...

    JAVA程序开发大全---上半部分

    15.3.1 开发Session Bean 261 15.3.2 开发Entity Bean 267 15.3.3 开发Message Driven Bean 275 15.4 本章小结 277 第16章 Java ME的开发及应用 278 16.1 Java ME概述 278 16.2 Wireless Toolkit的安装和配置 279 ...

    java面试题

    2、可以将各个框架进行有效的管理和控制,让数据传输安全。 spring的IOC和DI? 答:控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器中加载。提高安全性,减低耦合性,使各个...

    spring web flow demo

    Spring Web Flow 更像是抽象建模和技术细节的混血儿,相比于湮没在繁多的控制器和视图 中的 Web MVC 应用来讲, Spring Web Flow 提供了如清单 1 所描述的更高层次的抽象,但同时它也 整合了像 Unified EL 这样的...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

    Spring面试题

    依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中 ...

    Java Web程序设计教程

    第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 1.2.1面向对象的编程语言 3 1.2.2丰富的框架技术 4 1.2.3xml、css的应用 4 1.2.4使用...

Global site tag (gtag.js) - Google Analytics