当前位置: 代码迷 >> Java Web开发 >> 把reqesut当做参数传递之后,此reqesut无法再获取session,这是为何
  详细解决方案

把reqesut当做参数传递之后,此reqesut无法再获取session,这是为何

热度:56   发布时间:2016-04-16 21:32:18.0
把reqesut当作参数传递之后,此reqesut无法再获取session,这是为何?

我把request作为参数 传入定时器,目的是为了定时清除request.getSession()中的内容



但是定时器清除request.getSession()中的内容时报错了,NullPointException,我断点查看了一下,这个request确实传入定时器了,不过reqesut.getSession()为NULL。这是为何?谁能解决此问题?
------解决思路----------------------
本来就该直接传session 。。因为session是存活在一个对话期的 ,而request是存活在一次 请求中的 。。楼主那样传request实际上已经 脱离了它生命周期
------解决思路----------------------
引用:
我反复测试,发现reqesut只能在同一个类的方法之间互相传递,不能在类和类之间传递。否则就会出现request.getSession()为NULL的问题


完全是瞎扯,在request生命周期没有结束之前类和类之间随便玩。

你这个是因为在TimerTask的新线程里reqesut生命周期早就结束了(请求别告诉我你不知道啊,请求完毕就结束了),你得到的东西当然是空。

而session的生命周期是整个回话过程,就算请求结束了,会话不结束也是存在的。


------解决思路----------------------
非常准确,先把概念行设计弄清楚。request 完成之后就消失了,就算你还看到它,但服务器并不保证它的状态依然是正确的,因为与服务器关联的东西已经不一致了(服务器已经销毁了关联的状态)。就算你的代码在 tomcat 上能工作也不代表它在 jboss 上还能工作,因为这段代码本身就不符合设计要求。

引用:
而且就算你传session,也是有问题的。

要是你session的超时时间小于你定时的时间,在你定时触发以前session就结束了,也就是null了,你定时器在运行的时候一样会异常。

我不知道这种方式是谁设计的,漏洞太多,到后期自己挖坑自己填吧。
  相关解决方案