簡體   English   中英

Java Servlet會話:創建空會話,無法使其無效

[英]Java servlet, session: null session gets created, can't invalidate it

我有一個接受用戶名並將其傳遞給LoginServlet.java的表單,后者依次是:

  1. 如果沒有會話:為該用戶名創建一個會話,然后將請求轉發到LoginResultView.jsp ,該消息將LoginResultView.jsp “成功登錄,%username%”消息
  2. 如果已經有一個會話,則輸出“哇...”並使舊會話無效:

形式

<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>

servlet的:

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

    }
}

我還有一個導航欄,如果沒有會話,則顯示兩個按鈕:“登錄”和“注冊”,如果有會話,則顯示與該會話相關聯的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時,似乎沒有會話(這是兩個“登錄”和“注冊”按鈕),我仍然收到消息wow, how are you here, null 120 ( 120是session-timeout ,在web.xml文件中指定)。 然后,我只能通過再次發送相同的POST數據來發送表單的數據(我單擊了“續訂”按鈕,然后單擊“保存”上的“確定”)。 只有在那之后,我才能獲得LogoutResultView.jsp頁面。

為什么會這樣? null會話來自何處? 我如何解決它?

您獲得的會話不為空。 否則,您將獲得NPE。

您需要將session="false"屬性放入Navbar JSP的<%@page%>指令中。 否則,當首次訪問JSP時,將立即生成會話。 例如:

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

session屬性默認為true,因此,如果您沒有明確指定該屬性,則如果不存在會話,則始終在后台創建會話。

因此, if (session.getAttribute("loginUsername") != null)不會像通常那樣生成NPE。

如果將session="false"放入page指令,則檢查必須為if ( session == null ) 那就是你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM