jsp直接跳转到html而不是通过servlet

jsp directly jumps to html rather than through servlet

我制作了一个具有 loginlogout 功能的网络应用程序。

第一次登录和注销都正常

但是当我换一个账号重复上面的操作时,

注销操作直接跳转到index.html而不是通过

LogoutServlet.java。所以会话仍然有效。

你知道原因吗?

如果你告诉我原因,我将不胜感激。

我的关键代码如下。

LoginServlet.java

HttpSession session = request.getSession(false);
        if(session!=null) 
            session.setAttribute("LoginUser", user);
        request.getRequestDispatcher("/WEB-INF/jsp/home.jsp")
                   .forward(request, response);

home.jsp

<a href="Logout.action">Logout</a>

LogoutServlet.java

@WebServlet("/Logout.action")
protected void doGet(...) {
    HttpSession session = request.getSession(false);
    if(session!=null) {
        session.removeAttribute("LoginUser");
        session.invalidate();
    }
    request.getRequestDispatcher("/index.html").forward(request, response);
}

你可以在我的网站上试试。 http://anwuli.cn/HelloWorld

提供了 2 个测试帐户。

格式:用户名&密码

第一个:admin&123456

第二名:安鹏&123456

您正在使用 HttpSession session = request.getSession(false);,因此您不会在 LoginServlet.java.

中创建任何 new 会话

您在哪里创建第一个会话?

正如之前的回答所提到的。当您检查是否存在会话时,如果会话不存在,您就不会创建新会话:

request.getSession(false)

因此,当登录帐户尝试注销时,if 块不为真:

 if(session!=null) {
        session.removeAttribute("LoginUser");
        session.invalidate(); // this code never runs...
    }

您需要使用:

HttpSession session = (request.getSession());

HttpSession session =  request.getSession(true)

此外,只要新用户连接到您的网站(即使他们尚未登录),就会创建一个会话。

所以你需要像这样检查属性是否为空:

 if(null == session.getAttribute("LoginUser")){  
         //no logged in user
         RequestDispatcher rd=request.getRequestDispatcher("login.jsp"); //replace with your login page  
           rd.forward(request,response);    
           return;
    }else{
         //user attribute is not null so logout
        session.invalidate();
     }