我正在使用的 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
。
发送重定向后,您需要从该方法返回。
if (request.getParameter("logout") != null) {
session.invalidate();
response.sendRedirect("restanes.jsp");
return; // <--- Here.
}
否则,代码将继续运行并命中块中更下方的某个
session.getAttribute()
方法,从而导致此异常。至少,这是迄今为止描述的问题最可能的原因,并且基于这是一个非常常见的初学者错误这一事实。另请参见例如这个答案。
你的代码没问题
if(request.getParameter("logout") != null )
{
session.invalidate();
response.sendRedirect("restanes.jsp");
}
但请确保重定向页面不包含任何会话属性。 500 内部错误来自“restanes.jsp”页面。 使用重定向的页面和会话活动进行锻炼。
如果
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();
}