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

ale*_*xtc 4 java session jsp servlets httpsession

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

  • LoginServlet:通过将"name"属性设置为session来登录用户
  • 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

和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/>
Run Code Online (Sandbox Code Playgroud)

问题是,当用户登录时,被点击"注销"链接和"LogoutServlet"之称,会话不正确失效和ProfileServlet仍然打印出

"Hello, null Welcome to Profile"
Run Code Online (Sandbox Code Playgroud)

而不是重定向到"login.html"页面,因为会话仍然是null.因此,"link.jsp"页面上未显示"登录"链接.这会阻止用户再次尝试登录.

编辑: 为了澄清问题,我创建了一个新的html页面并更新了要执行的servlet

request.getRequestDispatcher("link.html").include(request, response);
Run Code Online (Sandbox Code Playgroud)

和"link.html".

<a href="login.html">Login</a>
<a href="LogoutServlet">Logout</a>
<a href="ProfileServlet">Profile</a>
<hr/>
Run Code Online (Sandbox Code Playgroud)

有趣的是,这就是我想要的!我想问题是

request.getRequestDispatcher("link.jsp").include(request, response);
Run Code Online (Sandbox Code Playgroud)

但我无法解释为什么......

Gas*_*Gas 6

在JSP中,默认情况下会创建新会话,如果不存在,那么您将始终获得非空会话.您可以通过向页面添加以下页面指令来禁用它:

<%@ page session="false" %>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看以下内容为什么设置JSP页面session ="false"指令?