关于系统session超时的实际问题? 400 报错
我先描述一下我现在的问题:
我现在有一个系统,我限制它,所有操作员在登录系统以后,如果30分钟没有进行操作(页面挂在那不动),session就会过期,并且会自动登出系统。
以上的功能已经实现,确实在登录以后30分钟不操作,再点击任何一个模块都会回到登录页面。
——————————————————————————
我现在又有一个需求,我需要写一个ajax定时器,在操作员登录以后,这个ajax定时器会每隔2分钟扫一张表。于是我就写了,功能也实现了。
——————————————————————————
现在问题出现了,在加入了ajax定时器以后,我即使30分钟没有做任何操作,session仍然不会超时。因为ajax每2分钟扫一次表,系统当做我已经进行了一个操作。
请教各位前辈,我如何做到屏蔽这个ajax定时器,在30分钟没有做操作仍然会自动登出。
http://ajaxpatterns.org/Timeout文章里面提到的方式应该是比较好的方案了,主要是在客户端处理,当即将超时时,给用户一个提示,让用户处理,当最后客户端真的超时时,再给用户一次机会处理。超时后停止掉ajax轮询,把超时信息发送给服务端,invalidate session。如果要采用自动地方式,需要捕捉鼠标,键盘事件。
######请求每个模块时,session储存下最后一次操作时间,ajax模式获取数据时,服务器端判断下是不是ajax请求,是的话,服务器端看下session最后一次操作时间,不满足要求就清空,退出处理。 不要依赖系统设置的session存活时间,这个不靠谱
######
这位兄弟说的的确不失为一种做法。
不过我们这边的系统目前session超时只是依赖的web.xml里的配置的时间,不会放在程序里面写。因为必须做到随时能够修改时间。
我想寻找一种改动尽量小一点的,毕竟这是正式投入生产的系统,我的主管不会让我为了这么一个需求,在每个模块里面存时间。
这个问题换一种说法就是,既然说我点击每一个模块,tomcat都当做我是发起了一次请求,那么我如何做到ajax请求过来的时候,我不把它当做请求。可以有最简单的方法么。
开发语言是java,开发工具eclipse/tomcat
######回复 @cgf986916 : 恩,我试试,非常感谢######单入口的话,更好弄了,入口处添加新session直接保存下最后操作时间,这个规则内做ajax请求判断,其他弄个包吧,引入下做个判断,或者做个拦截器也行,你自己看下那个符合你需求就行了。######大哥,你不会自己实现session啊。就是tomcat 里有个Set<userId> ajax不更新不完了。弄个拦截器。你也可以采用类似360的token机制。原理一样。
再一个方案是你弄个fiter。然后存用户最后时间,不合适的logout。哎目测你新手
如果要求不是特别高的话,就在cookie里面加入时间戳,如果是ajax的话,时间戳就不加进去,这样也可用做判断。
######这是最好的.######写一个filter 判断request的header是不是AJAX请求(X-Requested-With),
######当是AJAX请求的时候,不去确认登录与否######但是怎么才能让session不更新最后访问时间呢?######既然每隔两分钟就要扫表,干脆在后台做成定时任务好了,完全不需要前台的ajax来处理。管理员登录就开始这个Job,登出后就撤销。######回复 @liuxin : 非常感谢######回复 @龙王巴哈姆特 : 肯定不会啊,服务器端程序,并不需要登录或者请求的######扫完表以后要去更新页面导航上的一个数字,就跟QQ消息条数一样的。job做不到吧。 顺便问下,job扫表,容器会不会认为这也算一个操作行为,并认为这个session用户是活跃的? 本人初学,望多指点######找到解决方案了,你用一个JSP来实现这个扫表的功能,在JSP的开头加上<%@ page session="false" %>,这样就把session功能关闭了,不管你请求多少次,都不影响现有的用户。亲测可行。######这个头的作用是1.该JSP无法直接访问内置session变量 2.不会自动创建session。我试过ajax 2分钟扫一次,设置session超时是3分钟。我等了5分钟后,session仍然没有过期。这个头并不能阻止ajax在请求的时候自动记录session最后更新时间。
并且还有另外一个问题,就是我这里的ajax,是跟用户名,修改密码,退出一起的如下图:
代码结构大致是一个ul,li结构
<ul> <li>用户名XXX</li> <li>风险交易XXX</li> <li>修改密码</li> <li>退出</li> </ul>
,我把代码都放在一个JSP里面,然后include去了“风险交易”那个li里面,并加上了头<%@ page session="false" %>结果我发现整个页面都不能使用session变量了。导致我的用户名也显示不出来了。
昨天说的最多的加一个Filter也被我的主管无情的否决掉了。不管这个问题最后解决没,还是希望朋友们多交流,能让我多多学习下。
session超时的一篇文章:
http://zmx.iteye.com/blog/1846181######回复 @龙王巴哈姆特 : 你用的是include指令包含的子页面?这样恐怕不行。######回复 @antipro : 我测试的时候,确实是只让那个jsp页面返回18,丢在我那个li里面,我试过了不行。并且外层页面也不能使用session变量了。跟他同级的用户名就是取的session VO里的数据也失效了。这种定时扫表,并且之后要更新页面数字的,除了用ajax还有更好的选择吗?######你怎么把整个页面都用来实现你的功能了,我设想的JSP只要返回一个18就可以了,其他内容都还是用原来的功能啊。######我不知道你是怎么测试的,但是我亲自测试了是正常的。至于不能用session的问题,禁止了session当然不能再用了,难道就没有其他的方法访问你要的数据了吗?要灵活处理啊。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。