我正在调用java servlet
从我的页面注销,将所有值设置为null并重置http会话,如下所示:
public class logout extends HttpServlet
{
public void service(HttpServletRequest rq,HttpServletResponse rs)throws IOException,ServletException
{
try{
HttpSession ss=rq.getSession(false);
if(ss.getAttribute("uid")==null || ss.getAttribute("usr")==null || ss.getAttribute("acc")==null)
{
rs.sendRedirect("/");
}
rs.setHeader("Cache-Control","no-cache, no-store, must-revalidate");
rs.addHeader("Cache-Control", "post-check=0, pre-check=0");
rs.setHeader("Pragma","no-cache");
rs.setDateHeader ("Expires", 0);
HttpSession session = rq.getSession(false);
session.setAttribute("uid",null);
session.setAttribute("usr",null);
session.setAttribute("acc",null);
session.invalidate();
rs.sendRedirect("/");
}
catch(Exception exp)
{
//Catch
}
}
}
如果我点击退出按钮,那么退出就可以了。假设如果我没有注销一段时间假设30分钟然后按下注销按钮我得到一个空白页而不是重定向到主页。 在堆栈跟踪中,我得到了如下的错误:
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:494)
logout.service(logout.java:32)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我知道它会被捕获,因为会话将自动过期。我怎么处理这个?即使会话自动过期,我也需要重定向到主页。我该怎么办?
答案 0 :(得分:-1)
如果容器的会话已过期,则此行
HttpSession ss=rq.getSession(false);
将返回null
。
在使用not null
变量之前,您没有检查ss
,这可能会在运行时抛出异常。
而且,您不需要再有一个变量用于保持会话,您可以重用ss
。
if(ss != null){
if(ss.getAttribute("uid")==null || ss.getAttribute("usr")==null || ss.getAttribute("acc")==null)
{
// rs.sendRedirect("/");
}else{
rs.setHeader("Cache-Control","no-cache, no-store, must-revalidate");
rs.addHeader("Cache-Control", "post-check=0, pre-check=0");
rs.setHeader("Pragma","no-cache");
rs.setDateHeader ("Expires", 0);
ss.setAttribute("uid",null);
ss.setAttribute("usr",null);
ss.setAttribute("acc",null);
ss.invalidate();
// rs.sendRedirect("/");
}
}
rs.sendRedirect("/");
答案 1 :(得分:-1)
在我的catch(){}块中添加了一些更改,如下所示,现在工作正常。
catch(Exception exp)
{
RequestDispatcher dd = rq.getRequestDispatcher("/");
dd.forward(rq, rs);
}