知识大全 Struts架构中的Session对象创建和控制

Posted

篇首语:哪有什么四季,遇见你,四季如春。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Struts架构中的Session对象创建和控制相关的知识,希望对你有一定的参考价值。

Struts架构中的Session对象创建和控制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

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

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

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

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

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

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

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

  首先说明 IndexAction中没有去产生session对象 login jsp中设置<%@ page session= false %>

  ( )环境servlet + jsp

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

  ( )环境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()方法原型如下

  程序代码

>

  此类在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对象时生成的

cha138/Article/program/Java/ky/201311/28281

相关参考

知识大全 struts2 session使用

在Struts里如果需要在Action中使用session可以通过下面两种方式得到    通过ActionContextclass中的方法getSession得到    Action实现apaches

知识大全 Struts开发指南之MVC架构实际应用

Struts开发指南之MVC架构实际应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  模型视图

知识大全 学习反射中的动态创建对象

  Assembly的CreateInstance有三个重载第一个参数需要是一个字符串表示的完整的类名第二个参数是一个bool类型如果为true表示对第一个参数不区分大小写  第三个影响执行搜索的方式

知识大全 Application对象与Session对象

ASP讲座之三:Application对象与Session对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 Biztalk 开发之 如何快速创建架构

Biztalk开发之如何快速创建架构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使用Bizt

知识大全 JSP页面中Session对象详解

JSP页面中Session对象详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Session

知识大全 如何理解struts

  当请求一JSP页面时对应的FormBean会自动创建并由对应的属性设置struts标签的控件因此如果想要页面中的控件一开始就设置了初值的话请在FormBean的构造函数中设置相应的属性中  当请求

知识大全 架构模式-界面组装器模式

  本文提出了一种界面设计中的架构模式界面组装器模式它致力于分解界面将界面和组装行为解耦将界面逻辑处理与领域逻辑处理解耦这样我们在开发GUI胖客户端界面应用时可以从众多的界面控制管理中解脱出来而专注于

知识大全 oracle中process和session的关系

  在SharedServer中的Process和Oracle中的Session不是一一对应的SharedServer中的Process一个对应着Oracle中的一个或者一个以上的Session  我

知识大全 对象的创建和存在时间

  从技术角度说OOP(面向对象程序设计)只是涉及抽象的数据类型继承以及多形性但另一些问题也可能显得非常重要本节将就这些问题进行探讨  最重要的问题之一是对象的创建及破坏方式对象需要的数据位于哪儿如何