首先谈一下对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.
分享到:
相关推荐
当一个新的Java对象被创建,但尚未与Hibernate的Session关联时,它处于瞬时状态。这个状态下,对象没有被保存到数据库,任何对对象属性的修改不会自动同步到数据库。如果对象被删除,那么这些更改将永久丢失。 2. ...
在Java的持久化框架Hibernate中,缓存机制和Session对象的管理是其高效运作的关键要素。本文将深入探讨这两个主题,以帮助开发者更好地理解和利用Hibernate。 首先,让我们聚焦于Hibernate的缓存机制。缓存的存在是...
当用户登录成功后,服务器创建一个Session对象,并将用户的登录信息(如用户名、角色等)保存在其中。每个Session都有一个唯一的ID,这个ID通过Cookie返回给客户端浏览器,之后每次请求时浏览器都会携带这个ID,使...
当用户在应用程序的页面之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在,直到会话过期或结束。 - **存储位置**:Session数据通常存储在服务器上,因此安全性比Cookie更高。 - *...
Session对象在用户首次访问网站时创建,直到用户离开网站或Session超时后结束。通过Session对象,开发者可以在用户的不同页面间保持状态,例如购物车信息或用户登录状态。Global.asax文件中的Session事件(Session_...
在ASP.NET开发中,Application、Session和Cookie对象是三个核心的服务器端对象,它们用于管理和维护用户交互的...Global.asax文件则提供了对应用程序级事件的处理能力,帮助开发者更好地控制和管理应用程序的生命周期。
- `getTransaction()`:获取与当前`Session`相关的`Transaction`对象,以便检查或控制事务状态。 - `close()`:关闭`Session`,释放与数据库的连接。 总的来说,`Hibernate Session`负责对象的持久化操作,而`...
Java Session监听器是Java Servlet规范中提供的一种机制,用于对HttpSession对象的生命周期事件进行监听和处理。在Web应用程序中,Session是用来跟踪用户状态的重要工具,特别是在无状态的HTTP协议上。当用户登录后...
当一个 Session 开始时,Servlet 容器会创建一个 HttpSession 对象。在某些情况下,把这些 HttpSession 对象从内存中转移到文件系统中或数据库中,需要访问的时候再把它们载入到内存中来。这样做的好处有两点:节约...
- 可以在JSP文件中通过EL表达式或JSP脚本的方式访问Session对象。 - 例如,在页面中显示Session ID可以使用 `<%= session.getId() %>`。 3. **设置Session范围内的共享数据**: - 在JSP页面中,可以使用 `...
### 过滤器对于Session周期的控制 在探讨如何通过`OpenSessionInViewFilter`来有效管理Hibernate中的Session生命周期之前,我们需要先理解Session及其生命周期的基本概念。 #### Session与生命周期 在Hibernate...
通过以上两种监听器,开发者可以更精细地控制和监控Session的生命周期和属性变化,从而提高应用的可维护性和性能。例如,可以通过监听Session的销毁来清理数据库中的临时数据,或者在属性改变时实时更新用户界面。...
`Application`对象也有锁机制,如`Application.Lock`和`Application.Unlock`,用于在多用户环境下控制对共享数据的访问,避免并发问题。 3. `Server`对象: `Server`对象提供了许多服务,如URL编码、HTML编码、执行...
Session对象具有短暂性,通常在一次业务操作或一个用户会话中创建并使用,然后关闭,以确保资源的有效利用。 1. **Session的创建**:在Hibernate中,我们通常通过SessionFactory对象来创建Session。SessionFactory...
- **存储用户数据**:允许开发者通过键值对的形式在Session对象中存储用户相关的数据。 - **获取Session ID**:提供方法来获取当前会话的Session ID。 - **生命周期控制**:提供方法来创建、销毁Session以及设置...
在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...
在Java Web开发中,Session是服务器端用于跟踪用户状态的一种机制。当用户通过用户名和密码登录系统后,服务器需要一种方式来识别...在实际应用中,需要注意合理配置和安全使用Session,以提高应用的安全性和用户体验。
Session对象在用户首次访问时创建,并在用户离开网站或会话超时时销毁。Session对象通过SessionID标识每个会话,可以存储任何类型的数据,如用户登录状态、购物车信息等。Session.Abandon方法用于终止当前会话,释放...
1. **创建和获取 Session**: 在 JSP 中,可以使用 `session` 对象来创建和访问 Session。通过 `request.getSession()` 方法创建一个新的 Session,如果已有 Session,则返回该 Session。如果 `true` 作为参数传递...
这就需要我们创建一个自定义的Session工厂(SessionFactory)和Session实现。 1. 创建自定义SessionFactory 通常,我们会在应用启动时创建SessionFactory实例,这个过程包括配置Hibernate的属性(如数据库连接信息...