快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时官网:Struts构架中的Session对象创建和控制



首先谈一下对session工具在web开拓中的创建以及sessionId天生并返回客户真个运行机制.

session工具当客户端首次造访时,创建一个新的session工具.并同时天生一个sessionId,并在这次相应澳门24小时官网中将sessionId以相应报文的要领些回客户端浏览器内存或以重写url要领送回客户端,来维持全部会话,只要sever真个这个session工具没有销毁,今后再调用request.getSession()时就直接根据客户真个sessionId来检索server端天生的session工具并返回,不会再次去新建,除非根据此sessionId没有检索到session工具.

下面是在IE下测试,由于IE6.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),而是澳门24小时官网将处置惩罚事情交给RequestProcessor类,其process措施中会调用一系列的措施来完成响应的哀求处置惩罚和转向操作澳门24小时官网.此中有一个措施引起了我的关注,便是processLocale()措施.

Struts框架:RequestProcess类中的processLocale()措施原型如下:

法度榜样代码:

protected void processLocale(HttpServletRequest request,

HttpServletResponse response) {

// Are we configured to select the Locale automatically?

if (!moduleConfig.getControll澳门24小时官网erConfig().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);

}

}

此类在struts-config.xml设置设置设备摆设摆设文件中有对应的设置设置设备摆设摆设项:其缺省状态locale属性的值为true,也就会调用processLocale措施,并在第一次哀求时创建session工具和天生sessionId.但改为false后,在第一次哀求到达ActionServlet后不会调用processLocale措施,也就不会天生session工具了。

结果也就出来了,在struts利用中,*.do到达server端后颠末ActionServlet后转想我们自己写的IndexAction之前, (缺省状态) 时,就已经孕育发生了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中加上 时,此时假如再根据上面的流程来跟踪法度榜样,并在LoginAction用request.getCookies()测试时,其值是为null的,当然在IndexAction写上HttpSession session = request.getSession();时其是进入IndexActio澳门24小时官网n时新创建的,isNew也是true。

您可能还会对下面的文章感兴趣: