我有一个web应用。前台页面jsp提交到后台后,后台tomcat可能需要几秒到几小时的时间去处理。处理完就会将结果返回给前台页面。但用几小时去处理的话,这时页面的session早就过期。所以会返回这个错误 。
SEVERE: Exception occurred during processing request: getAttribute: Session already invalidated
java.lang.IllegalStateException: getAttribute: Session already invalidated        如果说在web.xml中设死了sesson的生命周期为几小时的话。那么对于处理开稍比较小的业务(几秒)来说也不合理。这样会大大占用服务器的资料。        如何用程序可以动态修改session的生命周期?

解决方案 »

  1.   

    感觉要未卜先知的样子,设置session生命之前得先知道当前这个任务需要多长时间去处理,我的项目上有个类似的问题,我说一下思路希望对你有帮助,就是做任务预处理,预处理能获得任务处理的时间、结果以及一系列任务过程中生成的中间数据,但是最终确不做事务提交,等拿到预执行结果后,获取中间数据,比如你需要的任务处理时常,然后才真正的去发起任务请求。设置session生命周期本身不难一句话,关键是设置之前得知道任务的时常,不知道是不是这里卡住你了。
      

  2.   

    自己写一个类实现HttpSessionListener。自自己监控
      

  3.   

    在创建session时设置 session.setMaxInactiveInterval(800);//秒
      

  4.   

    我的思路是定时刷新来保存session,但这个思路有问题,因为一刷新,之前前台页面的状态就全部清空了,之前提交后的等待状态(loading)都变回像刚刚打开页面的状态了
      

  5.   


    session我没应用到,只是app server内部应用到而已
      

  6.   

    其实楼主说这个问题我最近也遇到了,前台一个按钮,然后通过调用后台的shell脚本去执行数据库入库操作,如果是数据量小还没有什么,如果数据量超过几千万的话,就恼火了,往往后台还没有执行完,不仅仅是session超时,我这里用了ajax来提交,所以到了30秒之后,也会报响应失败错误。可以通过分段推送消息到前台,你可以让前台做一些处理,也可以不任何操作,来不让session失效。
      

  7.   


    在 sessionDestroyed方法中,如何写session续期
      

  8.   


    在 sessionDestroyed方法中,如何写session续期这例子google搜搜应该很多,自己都没有去实践
      

  9.   


    在 sessionDestroyed方法中,如何写session续期+1
      

  10.   


    你的思路是不是在 sessionDestroyed方法中,写session续期。但这样session如何知道系统处理完业务没有
      

  11.   

    系统一直在用到sesison作运算这也会过期么?在没有request请求发送sessionid的情况下默认30分钟容器销毁session?求大神一并解惑
      

  12.   

    设计上,在一个Blocking的请求中,执行时间超长的任务,非但你会遇到session超时的麻烦事,更多的时候,浏览器在你session超时之前就已经超时连接了!如果不是这样楼主忽略!我的建议是:
    1、任务的提交会立即返回,返回的结果只报告任务提交情况,后台在单独的线程中执行该任务,同时该任务管理器提供执行状态查询,具体实现可参考java.util.concurrent;
    2、任务管理器同时还可控制重复任务的提交,及其他的业务上的并发控制需求;
    3、客户端可通过脚本定期检查任务执行状态,以更新界面上的进度条之类的指示器,可以Ajax实现页面不刷新,由于定期更新基本也就不会有session丢失的问题;
    4、即使用户掉线了,甚至用户故意关闭了浏览器,在下次登陆时,任务管理器仍然能够通过任务提交者的相关信息查询到之前的任务进度(开这一个浏览器却不能碰,否则几个小时白瞎,跟个炸弹一样,体验不太好)。