2010-10-10 52 views
0

我創建了兩個servlet:爲什麼我的Java HttpServlet無法找到我的cookie的值?

UserReceiverServlet從表單中接收用戶名。然後它將用戶名設置爲屬性並將請求轉發給UserDisplayServlet。

UserDisplayServlet會將用戶名添加到cookie中,然後顯示當前設置的屬性和存儲的cookie的大陸。

不過,雖然我已經成功地確定肯定是正在創建的cookie和值被存儲,當這個servlet去尋找它,它沒有找到它

這裏是UserDisplayServlet。它被正確接收通過request.getAttribute值(「用戶名」),所以attributeUsername不是問題...

/** 
* 
*/ 
package hu.flux.user; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.http.*; 

/** 
* @author Brian Kessler 
* 
*/ 
public class UserDisplayServlet extends HttpServlet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public void service (HttpServletRequest request, HttpServletResponse response) 
    { 
     response.setContentType("text/html"); 

     String attributeUsername = (String) request.getAttribute("username"); 

     String cookieUsername = null; 
    for (Cookie cookie: request.getCookies()) 
     { if (cookie.getName() == "username") 
      { 
       String value = cookie.getValue(); 
       if (value.isEmpty()) { value = "--- EMPTY ---"; } 
       cookieUsername = cookie.getValue(); 
       break; 
      } 
     } 
    if (cookieUsername == null) {cookieUsername = "--- NOT FOUND ---"; } 

    String newCookieValue; 
    if (!(cookieUsername.isEmpty())) { newCookieValue = cookieUsername;} 
    else if (!(attributeUsername.isEmpty())) { newCookieValue = cookieUsername;} 
    else { newCookieValue = "UNKOWN";} 

     Cookie usernameCookie = new Cookie ("username", attributeUsername); 
     usernameCookie.setMaxAge(24*60*60); 
     response.addCookie(usernameCookie); 

     PrintWriter out = null; 
     try { out = response.getWriter(); } 
     catch (IOException e) 
     { 
      System.err.print ("Cannot getWriter():" + e); 
      e.printStackTrace(); 
     } 


     out.println("<html>"); 
     out.println("<head>"); 
      out.println("<title>User Display Servlet</title>"); 
     out.println("</head>"); 
     out.println("<body"); 

     if ((attributeUsername != null) && (!(attributeUsername.isEmpty()))) 
     { 
      out.println ("<p>I have an attribute which says your username is " 
        + request.getAttribute("username") + "</p>"); 
     } 
     else { out.println ("<p>The attribute hasn't been set.</p>"); } 


     if ((cookieUsername != null) && (!(cookieUsername.isEmpty()))) 
     { 
      out.println ("<p>You have a cookie which says your username is " + cookieUsername + "</p>"); 
      out.println ("</body></html>"); 
     } 
     else { out.println ("<p>The cookie hasn't been set.</p>"); } 


    } 


} 

如果它是有幫助的,這裏是接收輸入和轉發它的servlet到上面的小服務程序:

/** 
* 
*/ 
package hu.flux.user; 

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.*; 

/** 
* This simple servlet receives a username from a form, 
* stores the name in a context attribute, 
* and forwards the context attribute to another servlet 
* which displays the name. 
* 
* @author Brian Kessler 
* 
*/ 
public class UserReceiverServlet extends HttpServlet 
{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public void service (HttpServletRequest request, HttpServletResponse response) 
    { 
     String username = request.getParameter("username"); 
     request.setAttribute("username", username); 

     try { 

      getServletConfig() 
       .getServletContext() 
       .getRequestDispatcher("/userdisplay") 
       .forward(request, response); 
     } catch (ServletException e) { 
      System.err.println ("Can't forward: " + e); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      System.err.println ("Can't forward: " + e); 
      e.printStackTrace(); 
     } 


    } 
} 

我缺少什麼來檢索存儲在cookie中的值?

回答

1

發現了問題:

if (cookie.getName() == "username") 

應該是:

if (name.equals("username")) 

總是出遊我!

0

你怎麼知道cookie尚未設置? HTML主體肯定不會告訴你,因爲內容是在服務器端而不是客戶端評估的。如果您確實希望網頁告訴您cookie是否已成功設置,您需要在HTML中嵌入一些javascript以訪問瀏覽器的cookie存儲。

如果我試圖解決這個問題,我首先看看服務器和客戶端的HTTP響應。在服務器端開啓Web應用程序容器支持的響應轉儲/日誌記錄;例如對於Tomcat,請打開RequestDumperValve。在客戶端,使用瀏覽器的首選項對話框(或其他)來查看與您交互的服務器的Cookie存儲的內容。然後使用瀏覽器的Javascript調試器(或其他)來查看響應頭是否包含設置cookie的頭文件。 (如果你使用的是Firefox,安裝螢火蟲插件。)

+0

Cookie似乎已設置,但沒有附加名稱的值。我可以說,因爲我已經有了另一個servlet,它在被調用時讀取我的cookies並將內容轉儲回我的瀏覽器。 – 2010-10-10 09:32:12

+0

@布萊恩 - 接下來你需要弄清楚它的設置時間和方式,請參閱我的答案中的建議。 – 2010-10-10 09:40:37

+0

Cookie正在創建,沒有任何價值。它由上面的servlet創建。我用另一個servlet來確認這一點。此外,如果我將cookie的名稱更改爲「用戶名」(例如「test」)以外的內容,則會有一個新的cookie沒有任何價值。此外,Firebug確認沒有任何價值的cookie的存在。 – 2010-10-10 09:51:56

相關問題