我的JSP项目中有三个简单的HttpServlet类," LoginServlet"," 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();
}
}
和
@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/>
问题是当用户登录时,&#34;退出&#34;单击链接和&#34; LogoutServlet&#34;被调用,会话未正确无效且ProfileServlet仍然打印出来
"Hello, null Welcome to Profile"
而不是重定向到&#34; login.html&#34;页面,因为会话仍然是null。因此,&#34;登录&#34;链接没有显示在&#34; link.jsp&#34;页。这会阻止用户再次尝试登录。
编辑: 为了澄清问题,我创建了一个新的html页面并更新了要执行的servlet
request.getRequestDispatcher("link.html").include(request, response);
&#34; link.html&#34;。
<a href="login.html">Login</a>
<a href="LogoutServlet">Logout</a>
<a href="ProfileServlet">Profile</a>
<hr/>
有趣的是,这就是我想要的!我想问题是
request.getRequestDispatcher("link.jsp").include(request, response);
但我无法解释原因......
答案 0 :(得分:6)
在JSP中,默认情况下会创建新会话,如果不存在,那么您将始终获得非空会话。您可以通过向页面添加以下页面指令来禁用它:
<%@ page session="false" %>
有关详细信息,请查看以下Why set a JSP page session = “false” directive?
答案 1 :(得分:3)
当它调用invalidate()
时,它会从服务器上下文中删除该会话以及该会话的所有相关数据,
当您发出新请求时,它会创建一个新请求,因此您会看到null
作为数据,因为新会话中没有数据
您应检查session
内的逻辑属性,以验证用户是否已登录,而非会话本身
答案 2 :(得分:0)
这可以帮助您检查条件检查。
要检查的条件:
<%
if (session.getAttribute("name") == null ||
session.getAttribute("name").equals(""))
{
response.sendRedirect("login.jsp");
}
%>
注销时设置:
session.setAttribute("name", "");
session.invalidate();
response.sendRedirect("login.jsp");