如何有效地破坏 Java Servlet 中的“会话”?
Posted
技术标签:
【中文标题】如何有效地破坏 Java Servlet 中的“会话”?【英文标题】:How to effectively destroy 'session' in Java Servlet? 【发布时间】:2012-12-07 11:23:00 【问题描述】:我正在使用的 Servlet 有一个变量 session
。
我试过session.invalidate();
,这似乎破坏了会话,但是当我像response.sendRedirect("restanes.jsp");
那样进行重定向时,它给了我HTTP Status 500
这一行的错误:
java.lang.IllegalStateException: getAttribute: Session already invalidated
这是意料之中的,因为我试图破坏会话。
但是为什么页面无法重定向?在其他地方的同一页面上,我已成功重定向。
如何销毁会话并成功重定向?
代码sn-p:
if(request.getParameter("logout") != null )
session.invalidate();
response.sendRedirect("restanes.jsp");
更新:
我需要做的就是在response.sendRedirect("restanes.jsp");
之后return;
。衷心感谢BalusC
。
【问题讨论】:
500 错误很可能是由重定向后的页面(restanes.jsp)产生的。你能从日志中获得更多信息吗? 会话的存在/缺失不应影响重定向。 @Thilo 如果我删除 session.invalidate();重定向位工作正常。当我放回那行时,错误还指向我之前设置的会话变量。 您确定要重定向到的页面不需要来自您无效会话的信息吗? @MrGhimire - 但是有 会话。只是它是无效的。 【参考方案1】:你的代码没问题
if(request.getParameter("logout") != null )
session.invalidate();
response.sendRedirect("restanes.jsp");
但要确保重定向页面不包含任何会话属性。来自“restanes.jsp”页面的 500 内部错误。 处理重定向页面和会话活动。
【讨论】:
正如 OP 和 BalusC 所指出的那样;他的(根据姓名不确定性别)代码不正确。它需要 BalusC 的答案中给出的修复。【参考方案2】:发送重定向后需要从方法中返回。
if (request.getParameter("logout") != null)
session.invalidate();
response.sendRedirect("restanes.jsp");
return; // <--- Here.
否则,代码将继续运行并在块中进一步触发一些session.getAttribute()
方法,从而导致此异常。至少,这是迄今为止描述的问题的最可能原因,并且基于这是一个非常常见的初学者错误这一事实。另见例如this answer.
【讨论】:
很可能这就是正在发生的事情 - 在任何情况下都更有意义。如果 OP 确认,那么我将投票并删除我的答案。 @BalusC 我是 php 人,希望重定向能够完美运行(无需返回)。我已经用 return 进行了测试;和作品。谦虚的谢谢。 不客气。请注意,这同样适用于 PHP。您需要在header('Location: foo.php');
之后的 if
块中放置一个 exit;
,以防止代码的残余运行(尽管这在 PHP 中可能不一定有害;无论如何,网络浏览器都会忽略不必要地检索的 html)。以上是关于如何有效地破坏 Java Servlet 中的“会话”?的主要内容,如果未能解决你的问题,请参考以下文章
从 Java servlet 中的 POST 请求获取请求有效负载