jsp直接跳转到html而不是通过servlet
jsp directly jumps to html rather than through servlet
我制作了一个具有 login 和 logout 功能的网络应用程序。
第一次登录和注销都正常
但是当我换一个账号重复上面的操作时,
注销操作直接跳转到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();
}
我制作了一个具有 login 和 logout 功能的网络应用程序。
第一次登录和注销都正常
但是当我换一个账号重复上面的操作时,
注销操作直接跳转到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
.
您在哪里创建第一个会话?
正如之前的回答所提到的。当您检查是否存在会话时,如果会话不存在,您就不会创建新会话:
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();
}