我制作了一个具有登录和注销功能的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();
}