开发者社区> 问答> 正文

关于系统session超时的实际问题? 400 报错

关于系统session超时的实际问题? 400 报错

我先描述一下我现在的问题:

我现在有一个系统,我限制它,所有操作员在登录系统以后,如果30分钟没有进行操作(页面挂在那不动),session就会过期,并且会自动登出系统。

以上的功能已经实现,确实在登录以后30分钟不操作,再点击任何一个模块都会回到登录页面。

——————————————————————————

我现在又有一个需求,我需要写一个ajax定时器,在操作员登录以后,这个ajax定时器会每隔2分钟扫一张表。于是我就写了,功能也实现了。

——————————————————————————

现在问题出现了,在加入了ajax定时器以后,我即使30分钟没有做任何操作,session仍然不会超时。因为ajax每2分钟扫一次表,系统当做我已经进行了一个操作。

请教各位前辈,我如何做到屏蔽这个ajax定时器,在30分钟没有做操作仍然会自动登出。

展开
收起
爱吃鱼的程序员 2020-06-01 11:08:12 924 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    http://ajaxpatterns.org/Timeout文章里面提到的方式应该是比较好的方案了,主要是在客户端处理,当即将超时时,给用户一个提示,让用户处理,当最后客户端真的超时时,再给用户一次机会处理。超时后停止掉ajax轮询,把超时信息发送给服务端,invalidate session。如果要采用自动地方式,需要捕捉鼠标,键盘事件。
    ######请求每个模块时,session储存下最后一次操作时间,ajax模式获取数据时,服务器端判断下是不是ajax请求,是的话,服务器端看下session最后一次操作时间,不满足要求就清空,退出处理。 不要依赖系统设置的session存活时间,这个不靠谱
    ######

    这位兄弟说的的确不失为一种做法。
    不过我们这边的系统目前session超时只是依赖的web.xml里的配置的时间,不会放在程序里面写。因为必须做到随时能够修改时间。

    我想寻找一种改动尽量小一点的,毕竟这是正式投入生产的系统,我的主管不会让我为了这么一个需求,在每个模块里面存时间。

    这个问题换一种说法就是,既然说我点击每一个模块,tomcat都当做我是发起了一次请求,那么我如何做到ajax请求过来的时候,我不把它当做请求。可以有最简单的方法么。

    开发语言是java,开发工具eclipse/tomcat

    @cgf986916

    ######回复 @cgf986916 : 恩,我试试,非常感谢######单入口的话,更好弄了,入口处添加新session直接保存下最后操作时间,这个规则内做ajax请求判断,其他弄个包吧,引入下做个判断,或者做个拦截器也行,你自己看下那个符合你需求就行了。######

    大哥,你不会自己实现session啊。就是tomcat 里有个Set<userId> ajax不更新不完了。弄个拦截器。你也可以采用类似360的token机制。原理一样。

    再一个方案是你弄个fiter。然后存用户最后时间,不合适的logout。哎目测你新手



    ######恩,其实session这东西本身我就没弄太清楚。受教了######可以写一个全局的filter,在filter里存储session的最后一次操作时间啊,不必在每个模块里都写######我这边的要求是尽量不要有大的改动,因为访问量很大,如果加一个过滤器,会拦截每一次请求,又增添了系统的压力。 我听说有一种做法是直接在页面层套一个iframe还是什么的(只是听说),我现在必须是既完成任务,又要改动最小。######

    如果要求不是特别高的话,就在cookie里面加入时间戳,如果是ajax的话,时间戳就不加进去,这样也可用做判断。

    ######这是最好的.######

    写一个filter 判断request的header是不是AJAX请求(X-Requested-With),

    ######当是AJAX请求的时候,不去确认登录与否######但是怎么才能让session不更新最后访问时间呢?######既然每隔两分钟就要扫表,干脆在后台做成定时任务好了,完全不需要前台的ajax来处理。管理员登录就开始这个Job,登出后就撤销。######回复 @liuxin : 非常感谢######回复 @龙王巴哈姆特 : 肯定不会啊,服务器端程序,并不需要登录或者请求的######扫完表以后要去更新页面导航上的一个数字,就跟QQ消息条数一样的。job做不到吧。 顺便问下,job扫表,容器会不会认为这也算一个操作行为,并认为这个session用户是活跃的? 本人初学,望多指点######找到解决方案了,你用一个JSP来实现这个扫表的功能,在JSP的开头加上<%@ page session="false" %>,这样就把session功能关闭了,不管你请求多少次,都不影响现有的用户。亲测可行。######

    @antipro

    这个头的作用是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当然不能再用了,难道就没有其他的方法访问你要的数据了吗?要灵活处理啊。
    2020-06-01 11:08:14
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载