Java servlet, session : null session gets created, 无法使其失效

标签 java session tomcat servlets jakarta-ee

我有一个接受用户名并将其传递给 LoginServlet.java 的表单,后者依次:

  1. 如果没有 session :为该用户名创建一个 session 并将请求转发到 LoginResultView.jsp,后者显示“成功登录,%username%”消息
  2. 如果已经有 session ,打印出“wow...”并使旧 session 无效:

表单:

<form method="POST" action="LoginResult.do">
  <div>
     <label id="username-label" for="usr">username:</label><br/><br/>
     <input type="text"
            value="Enter a username"
            class="form-control form-input-field form- username-input-field default"
            id = "form-username-input-field" name="login-username"
     >                        
  </div>

  <button class="btn btn-success" type="submit">Sign up</button>
</form>

小服务程序:

public class LoginServlet extends HttpServlet {
     public void doPost(HttpServletRequest request, HttpServletResponse response) throws
                                                                        IOException, ServletException {
        String username = request.getParameter("login-username");

        response.setContentType("text/html");
        HttpSession session = request.getSession(false);  

        if (session==null)  {
                session = request.getSession(true);  
                session.setAttribute("loginUsername", username);
                RequestDispatcher view= request.getRequestDispatcher("view/LoginResultView.jsp");
                view.forward(request, response);
        }
        else  {
                response.getWriter().println(
                        "wow, how are you here, " + 
                        session.getAttribute("loginUsername"));
                response.getWriter().println(
                        session.getMaxInactiveInterval());
                session.invalidate();
        }

    }
}

我还有一个导航栏,如果没有 session ,它会显示两个按钮:登录和注册,如果有 session ,它会显示与该 session 关联的 loginUsername 属性:

<% HttpSession session2 = request.getSession(false);
     if (session.getAttribute("loginUsername") != null) {
%>
          <div class="dropdown navbar-link">
              <button class="btn btn-secondary dropdown-toggle"
                     type="button" id="dropdownMenuButton"
                     data-toggle="dropdown"
                     aria-haspopup="true" aria-expanded="false">
                 <a href="${pageContext.request.contextPath}/Login.jsp">                              
                   <%out.println(session2.getAttribute("loginUsername"));%>
                 </a>
              </button>

              <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                 <a class="dropdown-item"
                                     href="${pageContext.request.contextPath}">Profile</a>
                 <a class="dropdown-item"
                     href="#">Link2</a>
                 <a class="dropdown-item"
                  href="${pageContext.request.contextPath}/LogoutResult.do">                                
                      Log out
                  </a>
              </div>
     </div>

        <%
             }
             else  {
         %>
             <a href="${pageContext.request.contextPath}/Login.jsp"
                class="btn btn-info" role="button">Log in
             </a>

             <a href="${pageContext.request.contextPath}/Login.jsp"
                               class="btn btn-info" role="button">Sign up
             </a>


        <%
             }
        %>

问题是这样的:当我填写表单并将其发送到 LoginServlet 时,即使看似没有 session (它是那里的两个登录和注册按钮),我仍然会收到一条消息wow, how are you here, null 120(120 是 session-timeout,在 web.xml 文件中指定)。然后,我只能通过再次发送相同的 POST 数据来发送表单数据(我单击圆形的“更新”按钮并单击“确定”以保存以前的数据)。只有在那之后,我才能获得 LogoutResultView.jsp 页面。

为什么会这样?此 null session 从何而来?我该如何解决?

最佳答案

您获得的 session 为空。否则你会得到一个 NPE。

你需要把session="false"属性进入 <%@page%> Navbar JSP 的指令。否则,将在首次访问 JSP 时立即生成 session 。 例如:`

<%@ page language="java" contentType="text/html; charset="ISO-8859-1"
         pageEncoding="ISO-8859-1" session="false"
         import="java.util.*" %>`

session属性默认为 true,因此如果您没有明确指定,如果 session 不存在,将始终在后台创建一个 session 。

所以,if (session.getAttribute("loginUsername") != null)不会像通常那样生成 NPE。

如果你输入 session="false"进入你的页面指令,检查必须是if ( session == null ) .这就是你想要的。

关于Java servlet, session : null session gets created, 无法使其失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54369422/

相关文章:

JAVA JPA - 保留项目中所有对象的常规解决方案

java - 什么是最有用和最完整的 Java 备忘单?

php - Memcached 的 session 存储问题

apache - 使用 Tomcat 使用 HTTPS 反向代理配置 Bitbucket Server 的问题

java - Android在实现RecognitionListener时获取Intent

java - 如何在JasperReport中使详细信息部分不分割

php - 在生产服务器 codeigniter 3.1.2(PHP) session 销毁自动从 facebook 图形 API 重定向?

session - 具有无限 session 的 Tomcat 中的 GWT 应用程序

java - 我应该如何在 tomcat webapp 中外部化 jar 的配置?

tomcat - 需要手动启动tomcat