`
ywg2008
  • 浏览: 46429 次
  • 性别: 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[1].Web开发:JSP.Servlet.Struts.Spring.Hibernate.Ajax(PPT).rar

    通过Struts,开发者可以更好地分离业务逻辑、视图和控制层,提升应用的可扩展性和可维护性。 【Spring】是一个全面的后端应用框架,它支持依赖注入、AOP(面向切面编程)、事务管理等,简化了Java企业级应用的开发...

    精通Struts:基于MVC的JavaWeb设计与开发(孙卫琴)(pdf)

    2. **MVC设计模式**:MVC模式是一种将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分的设计模式。模型负责业务逻辑和数据处理,视图负责显示结果,控制器则作为模型和视图之间的桥梁,接收...

    王者归来之JAVA程序开发大全:基于MYECLIPSE平台+STRUTS+HIBERNATE+SPRING主体流框架开发.pdf

    Struts框架通过控制转发和ActionForm对象处理用户请求,提供了强大的视图渲染和业务逻辑管理能力。开发者需要理解Struts的配置文件、Action类、FormBean以及JSP标签,以便构建可维护、结构清晰的Web应用。 ...

    Java.Web开发JSP.Servlet.Struts.Spring.Hibernate.Ajax.rar

    本压缩包"Java.Web开发JSP Servlet Struts Spring Hibernate Ajax.rar"显然包含了几个关键的Java Web开发技术,包括JSP(JavaServer Pages)、Servlet、Struts、Spring、Hibernate以及Ajax。以下是对这些技术的详细...

    Java Web 基于Spring Struts Hibernate 轻量级架构开发实例

    在Java Web开发中,Spring、Struts和Hibernate是三个非常重要的轻量级框架,它们共同构建了一个强大的MVC(Model-View-Controller)架构。这个架构使得开发者能够更有效地管理和组织代码,提高开发效率和软件的可...

    Struts2 的Action使用session的方法

    6. **注意问题**:使用session时要注意避免创建过多的session对象,这可能导致服务器内存溢出。同时,session中的数据是全局的,不同用户之间如果不加以控制,可能会引发安全问题。因此,应当谨慎使用session,并...

    JAVA+MVC+WEB+Struts 开发实例源码

    【标题】"JAVA+MVC+WEB+Struts 开发实例源码" 是一个基于Java技术,使用Model-View-Controller(MVC)设计模式,Web应用开发的实践项目,其中Struts作为核心的框架。这个实例源码提供了一个完整的应用示例,帮助...

    0Java.Web开发:JSP.Servlet.Struts.Spring.Hibernate.Ajaxdianzijiaocheng

    这个教程“0Java.Web开发:JSP Servlet Struts Spring Hibernate Ajaxdianzijiaocheng”旨在为初学者提供一个全面的学习路径,深入理解这些核心概念和技术。 1. **JSP(JavaServer Pages)**:JSP是一种动态网页...

    第4章【源码】java web整合开发实战--基于struts 2+hibernate+spring 贾蓓 镇明敏 杜磊

    Struts 2作为MVC(模型-视图-控制器)架构的框架,主要用于处理Web应用程序的业务逻辑和控制层。它的主要优点包括强大的Action类、拦截器机制和丰富的结果类型,使得开发者能够构建出结构清晰、易于维护的Web应用。 ...

    jsp,struts,EL,session等注意总结集合

    当用户登录后,服务器会为该用户创建一个唯一的Session对象,并将其存储在服务器内存中。客户端通过Session ID(通常存储在cookie中)来标识其对应的Session。开发者可以在Session中存储用户信息,如登录状态、...

    MyEclipse开发Struts+Hibernate应用

    在IT行业中,开发Web应用程序时,常常会使用到一系列框架来简化开发流程并提高效率。本教程主要聚焦于使用MyEclipse集成开发环境(IDE)...在学习过程中,理解MVC架构和ORM思想是非常重要的,它们是现代Web开发的基础。

    零基础学Java.Web开发:JSP.Servlet.Struts.Spring.Hibernate.Ajax(PPT)

    本教程"零基础学Java.Web开发:JSP.Servlet.Struts.Spring.Hibernate.Ajax(PPT)"旨在为初学者提供一套全面的学习路径,帮助他们从零开始掌握这些核心技术。 1. **JSP(JavaServer Pages)** JSP是Java Web开发中的...

    struts2与hibernate整合开发

    Action类通常是Model层的一部分,它负责处理业务逻辑,并通过getter和setter方法与视图和控制器交换数据。 在给出的示例中,我们看到了一个简单的UserAction类,这个类继承自ActionSupport,实现了登录功能。当...

    web-struts

    Struts 是一款经典的Java Web开发框架,由Apache软件基金会维护,主要用于构建基于MVC(Model-View-Controller)设计模式的Web应用程序。Struts 2是其后续版本,结合了Struts 1和WebWork的优点,提供了更强大的功能...

    Struts 2 技术详解:基于WebWork核心的MVC开发与实践

    Struts 2 是一个强大的Java Web应用程序框架,它基于Model-View-Controller(MVC)设计模式,提供了灵活的架构来构建可维护性和扩展性...通过实际项目的练习,你可以更好地掌握Struts 2框架,并提升Java Web开发能力。

    java web 主流框架整合开发struts+hibernate例子

    Java Web开发是构建基于Web应用程序的关键技术,而Struts和Hibernate是两个非常流行的开源框架,分别专注于MVC(Model-View-Controller)架构和对象关系映射(ORM)。本示例将详细介绍如何整合这两个框架进行Java ...

    简单的实现Web登录(struts2+Hibernate)

    Struts2和Hibernate是两种非常重要的Java开源框架,它们在Web开发中有着广泛的应用。Struts2是一个MVC(Model-View-Controller)框架,主要负责处理用户请求、控制业务流程,并将数据传递到视图层展示。而Hibernate...

    第3章【源码】java web整合开发实战--基于struts 2+hibernate+spring 贾蓓 镇明敏 杜磊

    在Java Web开发中,Spring还提供了一种轻量级的MVC实现Spring MVC。在本章中,你将学习如何配置Spring的ApplicationContext,以及如何在Struts 2中利用Spring管理Bean。 整合这三个框架的关键在于理解它们之间的...

    Java Web主流框架整合开发:J2EE+Struts+Hibernate+Spring --源码

    Java Web开发领域中,J2EE(Java 2 Platform, Enterprise Edition)是核心平台,它提供了构建企业级应用的全面框架。在这个标题所指的整合开发中,Struts、Hibernate和Spring是三个非常重要的框架,它们分别在MVC...

    开发者突击_Java+Web主流框架整合开发_J2EE+Struts+Hibernate+Spring+源代码

    Java Web开发是IT行业中一个重要的领域,而SSH2(Struts2、Hibernate、Spring)是这个领域中的主流框架整合,用于构建高效、可维护的企业级应用程序。这些框架各自承担着不同的职责,共同构成了强大的开发工具集。 ...

Global site tag (gtag.js) - Google Analytics