我創建了兩個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