我制作了一个具有登录和注销功能的Web应用程序。

我第一次登录和注销似乎很正常。

但是当我更改另一个帐户并重复上述操作时,

注销操作直接跳转到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

最佳答案

如先前的答案所述。如果检查以下会话是否存在,则不创建新会话:

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)


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

因此,您需要像这样检查属性是否为null:

 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();
     }

09-04 08:04