我正在使用jsp
和servlet
开发一个Web应用程序。在我的应用程序中,我有一个注销部分,其中我使用以下代码:
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) {
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.invalidate();
rs.sendRedirect("/");
} catch (Exception exp) {
// rs.sendRedirect("/");
RequestDispatcher dd = rq.getRequestDispatcher("/");
dd.forward(rq, rs);
}
}
}
在浏览器中,如果我们连续使用并假设一周没有清除历史记录,那么如果我们登录并单击注销,则会将注销重定向到主页,但会话仍然存在。 会话未在注销时清除。
这个问题到底发生了什么?我的代码中是否还需要进行更改?
答案 0 :(得分:0)
不知道问题是什么,但有些建议。
所以最终的代码是,
dexOptions {
javaMaxHeapSize "4g"
}
答案 1 :(得分:0)
我认为您的应用程序中没有用户正确的会话管理。 我建议使用自定义过滤器来阻止每个页面的浏览器捕获。
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);
执行此操作后,您需要通过过滤器检查会话是否对每个请求有效,或者如果会话无效,则检查会话在每个页面上有效(查看),然后重定向到索引页。
并对Logout控制器进行一些修正。
public void service(HttpServletRequest rq, HttpServletResponse rs) throws IOException, ServletException {
try {
HttpSession session = rq.getSession(false);
session.removeAttribute("uid");
session.invalidate();
rs.sendRedirect("/");
} catch (Exception exp) {
RequestDispatcher dd = rq.getRequestDispatcher("/");
dd.forward(rq, rs);
}
}