JSP Servlet会话invalidate()不会使会话为空

时间:2014-12-17 00:26:17

标签: java jsp session servlets httpsession

我的JSP项目中有三个简单的HttpServlet类," LoginServlet"," LogoutServlet"和" ProfileServlet"。

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

@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);

但我无法解释原因......

3 个答案:

答案 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");