首先谈一下对session对象在web开发中的创建以及sessionId生成并返回客户端的运行机制.
session对象当客
户端首次访问时,创建一个新的session对象.并同时生成一个sessionId,并在此次响应中将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),而是将处理工作交给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()) {
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配置文件中有对应的配置项: < 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.
分享到:
相关推荐
23.1.1 Session对象的生命周期与本地线程绑定 23.1.2 Session对象的生命周期与JTA事务绑定 23.2 实现对话 23.2.1 使用游离对象 23.2.2 使用手工清理缓存模式下的Session 23.3 小结 23.4 思考题 第24章...
ASP提供一些内建对象,包括一些方法,属性。对象的方法用来和对象一起执行一些任务。对象属性用来设置对象指定状态的值。...存储在Session对象之中的变量对于用户是可以得到的,即使用户在应用程序之中正在浏览页面
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。 session...
5.1.5 控制insert和update语句 108 5.2 处理SQL引用标识符 109 5.3 创建命名策略 110 5.4 设置数据库Schema 112 5.5 设置类的包名 113 5.6 运行本章的范例程序 114 5.7 小结 120 5.8 思考题 121 第6章 映射...
5.1.5 控制insert和update语句 108 5.2 处理SQL引用标识符 109 5.3 创建命名策略 110 5.4 设置数据库Schema 112 5.5 设置类的包名 113 5.6 运行本章的范例程序 114 5.7 小结 120 5.8 思考题 121 第6章 映射...
23.1.1 Session对象的生命周期与本地线程绑定 23.1.2 Session对象的生命周期与JTA事务绑定 23.2 实现对话 23.2.1 使用游离对象 23.2.2 使用手工清理缓存模式下的Session 23.3 小结 23.4 思考题 第24章...
23.1.1 Session对象的生命周期与本地线程绑定 23.1.2 Session对象的生命周期与JTA事务绑定 23.2 实现对话 23.2.1 使用游离对象 23.2.2 使用手工清理缓存模式下的Session 23.3 小结 23.4 思考题 第24章...
23.1.1 Session对象的生命周期与本地线程绑定 23.1.2 Session对象的生命周期与JTA事务绑定 23.2 实现对话 23.2.1 使用游离对象 23.2.2 使用手工清理缓存模式下的Session 23.3 小结 23.4 思考题 第24章...
它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每...
10.4.2.2 Session对象 10.4.2.3 Request对象 10.4.2.4 Response对象 10.4.2.5 Server对象 10.4.2.6 ObjectContext对象 10.4.3 创建活动服务器组件——例程ASPComSamp 10.4.4 在ASP中测试ASPComp组件 小结 第11章 从...
scope属性 名称: scope类型:属性 ...request、session、application、websocket:设定创建出的对象放置在web容器对应的位置 三、bean的生命周期控制 用于控制方法的执行时机 名称: init-method, destroy-metho
java基础 一、仓库说明 Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结。 2、分类文档 ...会话跟踪技术,Session和Cookie详解 过滤器、监听器、拦截器,应用详解 Servlet 集成 C3P0
并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。 SessionBean在J2EE应用程序中被用来完成...
页面对象:Application、Session、Cookie、Request和Response 智能表单的创建:文本、表格、图像、上传等 客户端表单验证:普通验证、自定义验证、比较验证等 超链接、页面容器、广告、日历控件 用户控件、自定义...
◎页面对象:Application、Session、Cookie、Request和Response ◎智能表单的创建:文本、表格、图像、上传等 ◎客户端表单验证:普通验证、自定义验证、比较验证等 ◎超链接、页面容器、广告、日历控件 ◎用户控件...
在脚本code.php中,使用session_start()开启用户会话控制,然后包含验证码类Vcode所在文件vcode.class.php,创建该类对象并直接输出。就可以将随机生成的验证码图片发送出去,同时会自动将这个验证码字符串保存在...
控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在 Spring 框架中是 IOC 容器) 负责将...
| | | ├─────────使用组件和对象.txt | | | ├─────────使用脚本语言.txt | | | ├─────────使用集合.txt | | | ├─────────关于 ASP 应用程序.txt | | | ├──────...
它充当数据存储源的代理,并负责 创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的 ,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数 据库时,可以为...