无法在Cookie中添加超过2个值

时间:2017-12-23 07:32:28

标签: http servlets cookies

您好我是java servlets的新手。我试图用cookie实现简单的购物车问题。在我的网页中,我要求用户输入她可以添加到购物车的产品名称。

网页: 简单的文字输入(产品名称) 和一个按钮(添加到购物车)

点击按钮后,网页会显示购物车价值。

我遇到了一个奇怪的问题。它适用于少于3个值。当我尝试添加第三个值时,它只显示最近添加的两个值。例如,如果我分别添加产品a,b和c。它只显示b和c。

购物车Servlet代码:

String name = request.getParameter("productname");

Cookie cookie = new Cookie("product", name);
cookie.setMaxAge(100 * 60);     
response.addCookie(cookie);


Cookie[] cookies = request.getCookies();

List<String> names = new ArrayList<String>();
names.add(name);

if (cookies != null) {
    for (Cookie c: cookies) {
        if (c.getName().equals("product")) {
            names.add(c.getValue());
        }
    }
}

PrintWriter writer = response.getWriter();
for (String item: names) {
    writer.println("<h4>" + item + "</h4>");
}

的index.jsp:

<form method="post" action="Cart">
 <input type="text" name="productname" value="Product name">
 <input type="submit" value="AddToCart">
</form>

我花了这么多时间来弄清楚它里面的错误。但我无法解释这种奇怪的行为。请帮忙。

2 个答案:

答案 0 :(得分:1)

行为来自客户端(浏览器)和服务器如何处理具有相同名称的cookie。

  

“多个Cookie可能具有相同的名称但路径不同   属性“。

https://docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html

所以在你的情况下它基本上是相同的cookie(基于名称和路径)不断更新。

那么在您的情况下会发生什么:基本上,浏览器通过向HTTP请求标头添加字段将cookie返回给servlet。假设您的第一个产品名为a,并且您要发送名为b的第二个产品,那么您的Cookie标头就像

Cookie:JSESSIONID=BCC7050AE82AEA1A4B9BED1174424A92; product=a

和您的表单数据

productname:b

服务器收到请求,并创建一个新的Cookie并添加到HttpResponse cookie列表中。包含两个名为product的cookie的列表在您的响应中正确打印。由于servlet使用HTTP响应头将cookie发送到浏览器,并且您的cookie是相同的,因此只进行更新。

Set-Cookie:product=b; Expires=Sat, 23-Dec-2017 11:23:53 GMT 

因此,下一个请求仅包含有关产品b和产品a消失的信息。

答案 1 :(得分:0)

我发现即使在关闭浏览器之后,web.xml中的跟随部分也不会使会话无效。感谢fI12建议Session Lost when closing the browser的链接。

<session-config>
   <session-timeout>11520</session-timeout>
   <cookie-config>
     <max-age>11520</max-age>
   </cookie-config>
</session-config>

将Cookie用于购物车不是一种可扩展的解决方案。会议就是这样的方式。