【问题标题】:JSP Servlet session invalidate() does not make session nullJSP Servlet session invalidate() 不会使 session 为 null
【发布时间】:2015-02-15 11:02:55
【问题描述】:

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

  • Lo​​ginServlet:通过将“名称”属性设置为会话来登录用户
  • Lo​​goutServlet:注销用户并使会话无效
  • 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/>

问题是当用户登录时,当点击“注销”链接并调用“LogoutServlet”时,会话没有正确失效,ProfileServlet 仍然打印出来

"Hello, null Welcome to Profile"

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

编辑: 为了澄清问题,我创建了一个新的 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);

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

【问题讨论】:

    标签: java jsp session servlets httpsession


    【解决方案1】:

    这可能有助于您检查它以进行条件检查。

    检查条件:

    <%
    if (session.getAttribute("name") == null || 
    session.getAttribute("name").equals(""))
    {
    response.sendRedirect("login.jsp");
    }
    %>
    

    注销时设置:

    session.setAttribute("name", "");
    session.invalidate();
    response.sendRedirect("login.jsp");    
    

    【讨论】:

      【解决方案2】:

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

      <%@ page session="false" %>
      

      欲了解更多信息,请查看以下Why set a JSP page session = “false” directive?

      【讨论】:

      • 谢谢加斯。这就是我想要的!:)
      【解决方案3】:

      当它调用invalidate() 时,它会从服务器上下文中删除该会话以及与该会话相关的所有数据,

      当您提出新请求时,它会创建新请求,因此您将 null 视为数据,因为新会话中没有数据

      您应该检查 session 中的逻辑属性以验证用户是否登录,而不是会话本身

      【讨论】:

      • 感谢您的及时回复!但我想让会话为空,而不是创建一个没有与之关联的数据的新会话。我认为request.getSession(false) 是获取当前会话而不是创建一个新会话,不是吗?
      • 当您向服务器发出新请求时,如果尚未找到关联,它会创建会话
      • 因为您没有创建新请求,您只是将相同的请求转发到新资源
      • 谢谢吉格。解决了。​​
      猜你喜欢
      • 2013-02-22
      • 2014-01-09
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2020-05-28
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多