a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 116|回复: 1

[专业语言] JAVA认证:Struts架构中的Session对象创建和控制

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
首先谈一下对session对象在web开发中的建树以及sessionId生成并返回客户端的运行机制。   session对象当客户端初度访谒时,建树一个新的session对象。并同时生成一个sessionId,并在此次响应中将sessionId以响应报文的体例些回客户端浏览器内存或以重写url体例送回客户端,来连结整个会话,只要sever端的这个session对象没有销毁,往后再挪用request.getSession()时就直接按照客户端的sessionId来检索 server端生成的session对象并返回,不会再次去新建,除非按照此sessionId没有检索到session对象。
9 s3 E/ c7 I1 r; v% E  下面是在IE下测试,因为IE6.0的一个BUG就是IE的隐私设置即使是阻止所有cookie时,也仍是会以会话cookie来保留sessionId.所以下面都是以会话cookie来谈判的," A. K  ]) T. z0 y0 D5 T) {
  (1)在server没有封锁,并在session对象销毁时刻内,当客户端再次来请求server端的servlet或jsp时,将会将在第一次请求时生成的sessionId并附带在请求信息头中并向server端发送, server端收到sessionId后按照此sessionId会去搜索(此过程是透明的)server对应的session对象并直接返回这个 session对象,此时不会年夜头去成立一个新的session对象。
3 k, n* R% r) y) b) {- ]) g2 V8 `  (2)当server封锁(之前发生的session对象也就消亡了),或 session对象过了其销毁时刻后,浏览器窗口不关,并在本浏览器窗口再次去请求sever端的servlet和jsp时,此时同样会将 sessionId(server封锁或session销毁时生成的sessionId)发送到server端,server按照sessionId去找其对应的session对象,但此时session对象已经不存在,此时会年夜头生成一个新的session对象,并生成新的sessionId并同样将这个新生成的sessionId以响应报文的形式送到浏览器内存中。. H* t5 D7 X1 U, u' C: p* i
  (3)当server没有封锁,并session对象在其销毁时刻内,当请求一个 jsp页面回客户端后,封锁此浏览器窗口,此时其内存中的sessionId也就随之销毁,在年夜头去请求sever端的servlet或jsp时,会年夜头生成一个sessionId给客户端浏览器,并存在浏览内存中。$ F( {1 u6 m" K' [: X% \
  膳缦沔的理论在servlet中测试都是成立的,下面谈一下在struts框架下进行膳缦沔的测试时的分歧的处所。! r$ R# ]/ r; J. w* J4 H& \
  先简要说下测试轨范的流程:
& [: Q3 s- P. Y1 V  客户端请求index.do——>进入server端的IndexAction——>转向login.jsp页面——>请求login.do——>进入server端的LoginAction.3 N4 ]; z6 _8 O4 E% b8 i/ j
  首先声名:IndexAction中没有去发生session对象,login.jsp中设置.
" G# B& @" m) M- d7 U  (1)情形servlet + jsp:! Q" U$ l9 c7 Q* _+ W3 R
  在sevlet+jsp测试跟踪时,在index.do进入IndexAction 后转向login.jsp时,此时浏览器内存中是没有会话cookie的,那么在login.jsp上请求login.do进入LoginAction 后,用request.getCookies()测试时,其值是为null的!结不美观是稳合的,因为年夜始置终没有发生过session嘛!
. r8 e1 n3 O" U& L9 ~  (2)情形struts + jsp:5 `4 W$ n  G- n
  在struts+jsp测试跟踪时,跟膳缦沔的流程一样,起头想结不美观也应该是一样的, 但经由调试后发现结不美观却不是所想的那样。在login.do进入LoginActoin后用,用request.getCookies()测试时,发现其值不为null,即其有name和value,起头很不理解,因为根柢就没有建树过session对象,哪来的会话cookie值呢。可是结不美观有,那么想着此时浏览器内存中也就应该有会话cookie,问题就在这里!年夜哪里来的?
; H( R! H/ b% y$ Q, m. L. |6 v; B0 q" Y7 e' Y+ a* n) q. h
  后来经由细心考虑后,想到struts中的特点,我们自己写的Action类是担任struts的Action的,而且之前是经由struts的中心节制器ActionServlet来节制转向的,所以我想必定是在轨范进入我自己写的 IndexAction之前,struts框架中的代码必定已经建树了session对象并已经生成了sessionId.于是就找到相关书籍查看了 ActionServlet工作流程以及挪用哪些类,看了之后不美观真在其中看到了HttpSession session = request.getSession();这样一句话!于是谜底也就了然了。  巨匠知道struts的ActionServlet类中在领受到我们客户端的请求 (*.do)后(之前会做一系列初始化工作),并不是直接去措置我们的请求并挪用响应的Action(我们写的如IndexAction),而是将措置工作交给RequestProcessor类,其process体例中会挪用一系列的体例来完成响应的请求措置和转向操作。其中有一个体例引起了我的关注, 就是processLocale()体例。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:Struts架构中的Session对象创建和控制

  Struts框架:RequestProcess类中的processLocale()体例原型如下:</p>  轨范代码:
6 X1 J, S: C3 L* R  X1 e! N% C" g4 H. J: Y$ G7 |
6 K$ d- m& T9 {9 |  D$ i3 N
% {1 @7 {5 ], T# F; Z- c; c
protected void processLocale(HttpServletRequest request,        HttpServletResponse response) {        // Are we configured to select the Locale automatically?        if (!moduleConfig.getControllerConfig().getLocale()) {            return;        }        // Has a Locale already been selected?        HttpSession session = request.getSession();        if (session.getAttribute(Globals.LOCALE_KEY) != null) {            return;        }        // 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);        }    }
3 V1 g& ?$ t5 G" ]0 @  此类在struts- config.xml设置装备摆设文件中有对应的设置装备摆设项: < controller locale="true">< /controller> 其缺省状况locale属性的值为true,也就会挪用processLocale体例,并在第一次请求时建树session对象和生成 sessionId.但改为false后,在第一次请求达到ActionServlet后不会挪用processLocale体例,也就不会生成 session对象了。, ]. K1 d$ I- l
  结不美观也就出来了,在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()固瘸景M有值了!而且其值是RequestProcess类中的 processLocale()体例发生session对象时生成的。) s* {! q  @$ ]7 v5 L3 t8 X
  如不美观我们在struts-config.xml中加上< controller locale="false">< /controller> 时,此时如不美观再按照膳缦沔的流程来跟踪轨范,并在LoginAction用request.getCookies()测试时,其值是为null的,当然在 IndexAction写上HttpSession session = request.getSession();时其是进入IndexAction时新建树的,isNew也是true.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 03:26 , Processed in 0.192656 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表