如何有效地破坏 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 请求获取请求有效负载

如何有效地为 Java 中的单链表节点实现 hashCode()?

在不破坏严格别名的情况下有效地生成字节缓冲区

Java中如何使用session

servlet容器加载war过程

如何从字符串中的两个点破坏性地删除字符?