今天发现jboss给我丢出了一个错误。
"Session already invlidated!"
于是开始寻找这个BUG的原因,后来发现时我代码里有一句session.invalidate();
由于session是有效期的,也就是说web容器会在有效期到了之后把到期的session彻底清除。
但是我写这段代码的时候显然并没有考虑到这个。所以当一个失效的session被我执行invalidate()操作时报错了这个错误。
解决办法。
思路1:
session.invalidate()执行前先判断这个session是否已经invalid。
google了一下,看了下API,session并没有提供相关的方法,只能间接通过HttpSessionListener监听session的销毁然后将其保存至某变量实现。显然,这不是我想要的。
思路2:
利用异常,既然你抛异常,那我就捕捉异常。
对这句话加一个try{}catch{},显然,catch后就知道这个session已经invalid.
问题解决了,顺便研究了一下session的机制。通过跟踪发现,session.invalidate()方法只是将session得isValid属性设置为了false,而此时的session并没有销毁,其他属性如id等依然存有数据。但是我们看一下API的描述
Java代码
invalidate()
Invalidates this session then unbinds any objects bound to it.
invalidate()
Invalidates this session then unbinds any objects bound to it.
这里不仅仅是把isValid设置为了false,还解除这个session和其他任何对象的关联,也就是说,这个session虽然是存在的,但是是游离的,是孤立的。
所以,通过request.getSession(false);你将得到的是null,虽然session存在,但已和request解除绑定了。
那么为什么会这样?
我没有去看源代码,但是可以推理,session是由web容器管理的,众所周知,大量的对象创建和销毁操作会消耗很多的资源,所以这个session通过一个maxInactiveInterval属性来缓存在web容器里,这样当你再有效期内重新请求web容器,则web容器只需要isValid属性恢复为true,然后这个session又可以分配给你了。
我做了个实验,代码如下
Java代码
HttpSession currentsession = request
.getSession();
request.getSession().invalidate();
request.getSession(false);
HttpSession currentsession = request
.getSession();
request.getSession().invalidate();
request.getSession(false);
我在1分钟内执行了上面代码两次,两次获得的session id是一致的。
再次声明小弟没有看源代码,这里只是根据实验推测而已,如有不对的地方,还望指正。
最后指出一点
Java代码
sessionDestroyed
public void sessionDestroyed(HttpSessionEvent se)
Notification that a session was invalidated.
Parameters:
se - the notification event
sessionDestroyed
public void sessionDestroyed(HttpSessionEvent se)
Notification that a session was invalidated.
Parameters:
se - the notification event
sessionDestroyed事件只要session invalidated就会触发,当然web容器彻底销毁session的时候也会触发。
---------------------------------------------------
request.getSession().invalidate();
解除session与对象间的关联,此时session处于游离状态
分享到:
相关推荐
request.getSession().invalidate(); //跳转回登录页面 response.sendRedirect(request.getContextPath()+"/admin/login.jsp"); } public void register(HttpServletRequest request, HttpServletResponse ...
- **创建和获取 Session**:可以通过 `HttpServletRequest.getSession(boolean create)` 方法来创建或获取 Session。 - **设置和获取属性**:可以使用 `setAttribute(String name, Object value)` 和 `getAttribute...
这个过程通常是透明的,开发者可以通过`request.getSession()`方法获取到Session对象。Session对象的生命周期从创建时开始,直到服务器判断其达到最大无活动时间(默认通常为30分钟)或者调用`invalidate()`方法时...
* 或 `HttpSession session = request.getSession(boolean);` 设置值: * `session.setAttribute("key", 值对象);` 获取值: * `对象类型 obj = (对象类型)session.getAttribute("key");` 删除 Session 指定...
在一个javaweb应用中,可调用request.getSession(boolean xxx)生成Session。 Session的失效时间可以通过配置web.xml中的属性来定义,单位为分钟,若要使session有效时间为一天,则可以设为60*24,当设置为0或负数时...
HttpSession session = request.getSession(boolean value); ``` - 如果 `value` 为 `true`,则表示如果存在与当前请求关联的会话,则返回该会话;否则创建一个新的会话并返回。 - 如果 `value` 为 `false`,则...
Returns a boolean indicating whether the named response header has already been set. contextDestroyed(ServletContextEvent) - Method in interface javax.servlet.ServletContextListener Notification ...
- 获取Session:`HttpServletRequest.getSession(boolean create)`。 - 设置和获取属性:使用`setAttribute`和`getAttribute`方法。 - 移除Session:`session.invalidate()`。 #### 八、常见问题与解决办法 - *...
关于Web开发中的Session管理是Web应用开发者必须了解的基础知识点之一,尤其是在使用Java作为服务器端开发语言时,理解如何在Servlet中获取和管理Session变得尤为重要。本文将对在Servlet中如何通过Request对象获取...
session = request.getSession(true); session.setAttribute("user", user); sessions.put(userId, session); return session; } } // 在登录逻辑中调用UserSessionManager public boolean doLogin(User user,...
request.getSession().invalidate(); // 验证成功后清除session中的验证码 return "验证码验证成功"; } else { // 验证码错误 return "验证码错误"; } } ``` ### 关于SMTP授权码的理解和设置 SMTP授权码是一...
- `request.getSession(true)`:强制创建一个新的session,即使已经有一个活跃的session。 11. Page和PageContext的区别: - Page代表当前JSP页面的Java对象,它是Servlet API的HttpServletResponse的实例。 - ...
- 获取Session对象:`HttpSession session = request.getSession();` - 设置Session属性:`session.setAttribute(String name, Object value);` - 获取Session属性:`Object value = session.getAttribute(String ...
当Session终止时,服务器会释放Session对象以及所有绑定在Session上的对象。 绑定对象到Session中 如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到...
- `getSession([Boolean create])`:获取与请求关联的`session`对象。 - `removeAttribute(String name)`:移除请求中的一个属性。 - `setAttribute(String name, java.lang.Object obj)`:设置请求属性。 #####...
- `getSession(boolean create)`:获取`session`对象。 7. **application**:表示整个Web应用,它是`ServletContext`的接口。 - `getAttribute(String name)`:根据名称获取属性值。 - `setAttribute(String ...