文档章节

session already invalidate

吃兔纸不吐毛
 吃兔纸不吐毛
发布于 2017/03/17 11:47
字数 797
阅读 492
收藏 0

session already invalidate

// 涉及的主要代码
session.invalidate();

异常原因:

    出现这个原因是因为这个session在之前已经invalidate了,有可能是因为我在web.xml中配置的<session-timeout>如下代码块,原理还不清楚,但是应该是session.invalidate()了,在代码中再次调用就出错了。

<session-config>
  <session-timeout>1</session-timeout>
</session-config>

解决方案和思考:

    在session.invalidate()外面加判断,判断这个session是否已经invalidate了。

    但是有一个问题,通过DEBUG,我们可以知道,session有一个属性,叫isValid,调用invalidate()前,这个属性是true的,调用后就变成false了。并且invalidate()这个方法的原理不是销毁这个session对象,而是把isValid属性设置为true,并且把里面的信息全部清除,比如attribute信息等等,因为调用invalidate()后,session id仍然能获取到,并且session id不变。

    经过百度后,我发现request.isRequestedSessionIDValid()暂时可以用来判断session是否已经invalidate()了,经过DEBUG发现,session.invalidate()前后request.isRequestedSessionIDValid()的返回值分别是true和false。我们来看一看request.isRequestedSessionIDValid()的官方介绍:

isRequestedSessionIDValid()介绍

方法名 isRequestedSessionIDValid()
介绍

Checks whether the requested session ID is still valid.

检查所请求的会话ID是否仍然有效。

If the client did not specify any session ID, this method returns false.

如果客户端没有指定任何会话ID,则该方法返回false。

返回值

true if this request has an id for a valid session in the current session context; false otherwise

true:如果此请求在当前会话上下文中具有有效会话的ID

false:否则

    所以光判断request.isRequestedSessionIDValid()还不够,因为有可能客户端没有指定任何会话ID,还要判断session的值不为空,解决如下:

if (null != session && request.isRequestedSessionIdValid() != false) {
	session.invalidate();
}

 

====================2017.3.21更新====================

request.isRequestedSessionIdValid()无法判断当前session是否已经invalidate

原因:

1. 在第一次服务启动时,重现异常的步骤,成功,invalidate()前为true,后为false。

2. 服务器不关闭,不重启的情况下,重现异常的步骤,invalidate()前后都为true,失败。

新的解决方案:

暂无

====================2017.3.21更新​​​​​​​==========​​​​​​​==========

 

==========​​​​​​​==========2017.3.23更新​​​​​​​==========​​​​​​​==========

最终解决方案:

一直以来都有误区,没有好好利用监听器,我的想法是在session.invalidate()前,用session.setAttribute()添加一个标记,然后去监听器里判断,把标记放在一个Map中,这样程序里就可以判断了,这个功能是做另外一个功能的时候用的,碰巧这里也可以用。(此处情况多变,只提供思路,没有代码

==========​​​​​​​==========2017.3.23更新​​​​​​​==========​​​​​​​==========

建议:

    最后建议如果要做session超时、不同设备的异地登陆等方法的时候,最好不要让session整个销毁来判断,而是手动在listener,inteceptor等类中手动控制,将用户对象添加/移除到session的attribute中来做操作,后期的坑会少一点。

后期已知的坑:

因为没办法判断session已经invalidate了,所以进行以下操作会报错,而且无法解决,还有常用的频率高的对attribute操作也会报错。

session.invalidate();
session.setAttribute("", "");
session.getAttribute("");

 

© 著作权归作者所有

共有 人打赏支持
吃兔纸不吐毛
粉丝 3
博文 62
码字总数 31252
作品 0
杭州
私信 提问
JSP Session对象

Session Session用于区分不同的用户,每一个session就表示一个用户。在jsp中javax.servlet.http.HttpSession对象。Session在实际的操作中主要的功能是判断用户是否登陆。常用方法: No 方法 ...

李茂冉
2016/05/20
5
0
JSP用AppScan安全扫描时提示“会话标识未更新”问题的修复

有一段时间没有上CSDN了,今天看到有好几个网友问我“会话标示未更新问题”,以下是我的解决办法。 我的系统在做AppScan安全扫描时,爆出一个高危漏洞:会话标识未更新。提供的解决办法是,在...

黑帽子
2013/06/09
0
0
在关闭页面时自动清除Session

在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息。 清除session对象内容...

飞翼
2016/12/26
200
0
java web session management

1 How to find by jsessionid? You need to collect them all in a using a yourself. Just register it in as follows to run it: Then, anywhere you want just do to get the in question......

蜡笔小小小新
2016/06/19
48
0
java.lang.IllegalStateException: getAttribute: Session already invalidated

在做退出登录的时候,注销session public String exit(){ //清空session request.getSession().invalidate(); return "exit"; } 但是,点击退出时,报java.lang.IllegalStateException: getA......

妞妞超人
2013/06/04
3.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

聊聊ShenandoahGC的Brooks Pointers

序 本文主要研究一下ShenandoahGC的Brooks Pointers Shenandoah Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有 Snapshot-at-the-beginning concurrent mark包括Init Mark(P......

go4it
昨天
0
0
Makefile通用编写规则

#简单实用的Makefile模板: objs := a.o b.o test:$(objs) gcc -o test $^ # .a.o.d .b.o.d dep_files := $(foreach f,$(objs),.$(f).d) dep_files := $(wildcard $(dep_files)) ifneq ($(d......

shzwork
昨天
0
0
《万历十五年》的读后感作文4000字

《万历十五年》的读后感作文4000字: 万历十五年,即1587年,距今已过去432年。在明朝276的历史中,这一年很平淡,并没有什么特别之处。黄仁宇的《万历十五年》一书,有别于其他的历史叙述方...

原创小博客
昨天
0
0
vue组件系列4、Table封装下

知道了slot 怎么用,才可以理解table这样封装的原因 table插件部分 <template> <div> <!-- 关键字部分 --> <div class="pre_search" v-show="show_key"> <label>关键字:......

轻轻的往前走
昨天
0
0
laravel嵌套预加载限制字段

之前有写过laravel关联查询的坑,后经一位博友提醒可以简写,详见https://my.oschina.net/u/3470006/blog/3020215 自己实践了下果然如此,要查询user表和与之关联的信息表userinfo直接可以用...

gcudwork
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部