我的 JSP 项目中有三个简单的 Http Servlet 类:“LoginServlet”、“Logout Servlet”和“Profile Servlet”。
- LoginServlet:通过为会话设置“name”属性来登录用户
- LogoutServlet:注销用户并使会话无效
- ProfileServlet:如果用户已登录,则显示用户欢迎信息
最后两个 servlet 如下,我认为是有问题的。
@SuppressWarnings("serial")
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out=response.getWriter();
HttpSession session=request.getSession(false);
session.invalidate();
request.getRequestDispatcher("link.jsp").include(request, response);
out.print("You are successfully logged out!");
out.close();
}
}
And
@SuppressWarnings("serial")
public class ProfileServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
request.getRequestDispatcher("link.jsp").include(request, response);
HttpSession session = request.getSession(false);
if (session != null) {
String name = (String) session.getAttribute("name");
out.print("Hello, " + name + " Welcome to Profile");
} else {
out.print("Please login first");
request.getRequestDispatcher("login.html").include(request,
response);
}
out.close();
}
}
和 link.jsp:
<% HttpSession nsession = request.getSession(false);
if(nsession == null) {
%>
<a href="login.html">Login</a>
<%
}
else {
%>
<a href="LogoutServlet">Logout</a>
<%
}
%>
<a href="ProfileServlet">Profile</a>
<hr/>
问题是当用户登录时,当单击“Logout”链接并调用“LogoutServlet”时,会话未正确失效并且 ProfileServlet 仍然打印出来
"Hello, null Welcome to Profile"
而不是重定向到“login.html”页面,因为会话仍然不为空。因此,“link.jsp”页面上不会显示“Login”链接。这会阻止用户再次尝试登录。
EDIT:为了澄清问题,我制作了一个新的 html 页面并更新了 servlet 来执行以下操作
request.getRequestDispatcher("link.html").include(request, response);
还有“link.html”。
<a href="login.html">Login</a>
<a href="LogoutServlet">Logout</a>
<a href="ProfileServlet">Profile</a>
<hr/>
有趣的是,这正是我想要的!我想问题是
request.getRequestDispatcher("link.jsp").include(request, response);
但我无法解释为什么......