Jsp 使用servlet和过滤器的注销功能

Jsp 使用servlet和过滤器的注销功能,jsp,servlets,servlet-filters,logout,back-button,Jsp,Servlets,Servlet Filters,Logout,Back Button,这是我的筛选代码,下面的代码是servlet中的doPost()方法。 我正在尝试实现注销功能。单击注销按钮时,控件被发送到servlet,然后重定向到我的登录页面。然而,我有一个问题。浏览器显示页面未正确重定向。关于这个话题,我一直在讨论所有的问题,似乎没有什么能帮我解决。我也有后退按钮的问题,用户即使在注销后也会返回页面。有人能解释一下我做错了什么吗 LogoutFilter.java public void doFilter(ServletRequest req, ServletRespo

这是我的筛选代码,下面的代码是servlet中的
doPost()
方法。 我正在尝试实现注销功能。单击注销按钮时,控件被发送到servlet,然后重定向到我的登录页面。然而,我有一个问题。浏览器显示页面未正确重定向。关于这个话题,我一直在讨论所有的问题,似乎没有什么能帮我解决。我也有后退按钮的问题,用户即使在注销后也会返回页面。有人能解释一下我做错了什么吗

LogoutFilter.java

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    HttpSession session = request.getSession(false);         
     if (session == null || session.getAttribute("loginUsername") == null) {
    response.sendRedirect("login.jsp"); // No logged-in user found, so redirect to login page.
} else {
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setDateHeader("Expires", 0);
    chain.doFilter(req, res);  
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            request.getSession().invalidate();
            RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
            rd.forward(request, response);

}
LogoutServlet.java

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    HttpSession session = request.getSession(false);         
     if (session == null || session.getAttribute("loginUsername") == null) {
    response.sendRedirect("login.jsp"); // No logged-in user found, so redirect to login page.
} else {
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setDateHeader("Expires", 0);
    chain.doFilter(req, res);  
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            request.getSession().invalidate();
            RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
            rd.forward(request, response);

}
编辑:另外,当我从我的项目中输入一个页面的随机url时,它会显示出来,用户无需登录。如何避免这种情况发生


更新:我通过使用一些验证并相应地重定向到登录页面,解决了随机url页面显示问题。注销功能正在运行。但是,当我按下后退按钮时,它会重定向到登录页面本身(根据需要),但是,再次按下后退按钮时,浏览器会显示文档已过期消息,如果我按下刷新,安全页面会再次显示。谁能告诉我这里有什么问题吗?

看起来您已经在servlet
过滤器中实现了重定向逻辑。如果每次收到对
login.jsp
的请求时都点击
doFilter
,这将根据您的筛选器映射导致重定向循环。
因此,解决方案是url映射过滤器,如果url与
login.jsp

或者,您可以检查过滤逻辑本身是否命中了
login.jsp
。例如:

boolean isLogin = req.getRequestURI().contains("/login.jsp");
if (!isLogout && (session == null || session.getAttribute("loginUsername") == null)) {
   ...

请分享您为过滤器设置的url模式。我已使用web.xml文件更新了问题,直到浏览器显示“页面未正确重定向”。请尝试将
startsWith(req.getContextPath()+“/logout.jsp”)
替换为
contains(“logout.jsp”)
。如果这仍然没有帮助,您应该对它运行调试以查看循环重定向的原因,或者至少在
isLogout
变量周围抛出几个
System.out.println
,以查看它是否设置正确。我没有
logout.jsp
。我正在重定向到一个servlet进行验证。我应该用什么来代替
logout.jsp
?对不起,应该是
login.jsp
,您正试图重定向到的那个,以防止循环。更新了答案。