2010-10-10 73 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

相关问题