`
qys2010
  • 浏览: 123986 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于session.invalidate()、request.getSession(boolean)的一点实验

    博客分类:
  • java
阅读更多
今天发现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处于游离状态
分享到:
评论

相关推荐

    CSharp 4.0 .Net Framework V4.0 Control.Invalidate 方法

    CSharp 4.0 .Net Framework V4.0 Control.Invalidate 方法

    SpringSession+Redis实现Session共享案例

    SpringSession+Redis实现Session共享案例,详情请看http://blog.csdn.net/u012702547/article/details/72991283

    HttpSessionListener监听session的创建及销毁,实现在线用户统计

    用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...

    在JSP中使用Session制作简单的登录模块

    session.invalidate(); } else { out.println("请先登录,谢谢") ; out.println(" 经过五秒之后,网页会自动返回Login.jsp"); <br>response.setHeader("Refresh","5;URL=Login.jsp"); ...

    数据库测试test.sql

    request.getSession().invalidate(); //跳转回登录页面 response.sendRedirect(request.getContextPath()+"/admin/login.jsp"); } public void register(HttpServletRequest request, HttpServletResponse ...

    Android中View绘制流程以及invalidate()

    Android中View控件的Demo,值得学习。实现画多个圆圈的效果。

    javaEE j2ee 大学考试题库,j2ee开发面试题库-1

    String str=(String)session.getAttribute("name"); D. 无法取出 4. 在 JSP 页面中定义一个 int 型的全局变量 myInt,定义的方法是( )。 A. <% int myInt %> B. ! int myInt !%> C. !%> D. ! int myInt %>

    画闪烁移动小球

    dtest.invalidate(); layout.addView(dtest); handler=new Handler(); handler.post(new Runnable() { @Override public void run() { dtest.invalidate(); handler.postDelayed(this, 50...

    servlet2.4doc

    Returns a boolean indicating whether the named response header has already been set. contextDestroyed(ServletContextEvent) - Method in interface javax.servlet.ServletContextListener Notification ...

    Invalidate.doc

    Invalidate与UpdateWindow区别.doc

    php.ini-development

    request_order ; Default Value: None ; Development Value: "GP" ; Production Value: "GP" ; session.gc_divisor ; Default Value: 100 ; Development Value: 1000 ; Production Value: 1000 ; session.hash_...

    JSP中实现系统登录后的退出原理及代码

    首先要在你登录的页面的某个地方... session.invalidate(); %> ”login.jsp”></jsp> 首先让其注销session,然后跳转到登录页面,当然,你可以写上你想要跳转的页面! 您可能感兴趣的文章:java(jsp)整合discuz同步登录

    Making-website-using-JSP

    使用JSP制作网站 该网站的概要: ... SessionMemberLogin.java:...SessionLogOut.jsp:* session.invalidate(); Member.sql:*用于成员信息和邮政编码的sql ZipcodeBean.java:* DAO,提供邮政编码(地址)信息 Regis

    Invalidate()函数[参考].pdf

    Invalidate()函数[参考].pdf

    3-基础控件1

    84 20.1.4. requestLayout方法 86 20.1.5. invalidate方法 87 20.2. ViewHolder相关 87 20.2

    invalidate

    invalidate()的用法 主要用于刷新

    分析invalidate流程例子

    分析invalidate流程例子

    Spring Security 中文教程.pdf

    invalidate-session 属性 B.1.14. <custom-filter> 元素 B.2. 认证服务 B.2.1. <authentication-manager> 元素 B.2.1.1. 元素 B.2.1.2. 使用 <authentication-provider> 来引用一个 ...

    SpringSecurity 3.0.1.RELEASE.CHM

    invalidate-session属性 B.1.14. 元素 B.2. 认证服务 B.2.1. 元素 B.2.1.1. 元素 B.2.1.2. 使用 <authentication-provider> 来引用一个 AuthenticationProvider Bean B.3. 方法安全 B.3.1. 元素 B.3.1.1. ...

    StudentManagementSystem:一个可以管理学生成绩并自我传达信息的系统

    StudentManagementSystemA system that can manage students' grades and message themselves---------------...session.invalidate();response.sendRedirect("login.jsp");%>-----------------10.27/28开发记录----

Global site tag (gtag.js) - Google Analytics