如何有效地销毁Java Servlet中的“会话”?

问题描述 投票:0回答:3

我正在使用的 Servlet 有一个变量

session

我已经尝试过

session.invalidate();
,这似乎已经破坏了会话,但是当我像这样进行重定向时
response.sendRedirect("restanes.jsp");
,它给了我
HTTP Status 500
这一行错误:

java.lang.IllegalStateException: getAttribute: Session already invalidated

这是预料之中的,因为我试图破坏会话。

但是为什么页面无法重定向呢?在其他地方的同一页面上,我已成功重定向。

如何成功销毁会话并重定向?

代码片段:

if(request.getParameter("logout") != null ){  
        session.invalidate();
        response.sendRedirect("restanes.jsp");
}

更新: 我需要做的就是

return;
之后
response.sendRedirect("restanes.jsp");
。衷心感谢
BalusC

java session servlets destroy
3个回答
45
投票

发送重定向后,您需要从该方法返回。

if (request.getParameter("logout") != null) {  
    session.invalidate();
    response.sendRedirect("restanes.jsp");
    return; // <--- Here.
}

否则,代码将继续运行并命中块中更下方的某个

session.getAttribute()
方法,从而导致此异常。至少,这是迄今为止描述的问题最可能的原因,并且基于这是一个非常常见的初学者错误这一事实。另请参见例如这个答案


0
投票

你的代码没问题

if(request.getParameter("logout") != null )
{  
  session.invalidate();
  response.sendRedirect("restanes.jsp");
}

但请确保重定向页面不包含任何会话属性。 500 内部错误来自“restanes.jsp”页面。 使用重定向的页面和会话活动进行锻炼。


0
投票

如果

session.invalidate()
不起作用,您可以执行另一件事。 只需在
System.out.flush()
之后使用
session.invalidate()
:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    HttpSession session = req.getSession();
    session.invalidate();

    RequestDispatcher rd = req.getRequestDispatcher("/index.html");
    rd.forward(req, resp);
    
    System.out.flush();
}
© www.soinside.com 2019 - 2024. All rights reserved.