我创建了两个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中的值?
Cookie似乎已设置,但没有附加名称的值。我可以说,因为我已经有了另一个servlet,它在被调用时读取我的cookies并将内容转储回我的浏览器。 – 2010-10-10 09:32:12
@布莱恩 - 接下来你需要弄清楚它的设置时间和方式,请参阅我的答案中的建议。 – 2010-10-10 09:40:37
Cookie正在创建,没有任何价值。它由上面的servlet创建。我用另一个servlet来确认这一点。此外,如果我将cookie的名称更改为“用户名”(例如“test”)以外的内容,则会有一个新的cookie没有任何价值。此外,Firebug确认没有任何价值的cookie的存在。 – 2010-10-10 09:51:56