Http 无法在Cookie中添加2个以上的值

Http 无法在Cookie中添加2个以上的值,http,servlets,cookies,Http,Servlets,Cookies,嗨,我是java servlet的新手。我试图用cookies实现简单的购物车问题。在我的网页中,我要求用户输入一个可以添加到购物车中的产品名称 网页: 简单文本输入(产品名称) 和一个按钮(添加到购物车) 单击按钮后,网页将显示购物车值 我遇到了一个奇怪的问题。对于小于3个值,它可以正常工作。当我尝试添加第三个值时,它只显示最近添加的两个值。例如,如果我分别添加产品a、b和c。它只显示b和c 购物车Servlet代码: String name = request.getParameter("p

嗨,我是java servlet的新手。我试图用cookies实现简单的购物车问题。在我的网页中,我要求用户输入一个可以添加到购物车中的产品名称

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

单击按钮后,网页将显示购物车值

我遇到了一个奇怪的问题。对于小于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>");
}
String name=request.getParameter(“productname”);
Cookie Cookie=新的Cookie(“产品”,名称);
cookie.setMaxAge(100*60);
addCookie(cookie);
Cookie[]cookies=request.getCookies();
列表名称=新的ArrayList();
名称。添加(名称);
如果(cookies!=null){
用于(Cookie c:cookies){
如果(c.getName().equals(“产品”)){
name.add(c.getValue());
}
}
}
PrintWriter=response.getWriter();
用于(字符串项:名称){
writer.println(“+item+”);
}
index.jsp:

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


我花了这么多时间来找出它的毛病。但我找不到任何错误来解释这种奇怪的行为。请提供帮助。

这种行为来自您的客户端(浏览器)和服务器处理同名cookie的方式

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

因此,在您的情况下,它基本上是相同的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 

因此,下一个请求只包含有关product
b
的信息,product
a
消失。

我发现web.xml中的以下内容即使在关闭浏览器后也不会使会话无效。感谢fI12提供的链接


11520
11520

在购物车中使用cookies不是一个可扩展的解决方案。会话是实现这一点的方法。

@f1I2这是否意味着每次将产品添加到购物车时,我都应该为cookie使用不同的名称?事实上,我想知道网站是如何实现购物车的?如果我使用http会话,一旦浏览器关闭,它们就会丢失。这就是为什么我用饼干,这样他们可以停留更长的时间。但是Cookie存在这个容量问题,oracle文档说每个web服务器只支持20个Cookie。这意味着它是一个非常宝贵的资源。@assasinC会话本身由cookie标识,默认情况下,只要浏览器打开,cookie就会一直存在。您基本上希望会话cookie的寿命长于此默认值。这描述了如何做到这一点。这正是我在文章中所说的。我正在使用cookieAPI并将其添加到响应中,然后从请求中获取cookie。但这里的问题是,我应该如何使用cookie添加多个购物车项目。因为如果我保持相同的名称,它将被现有的名称替换,但是如果我为每个购物车项目指定不同的名称,那么很快Cookie就会耗尽。我可以看到的一种方法是将其放入分隔字符串中。因此,每次我在购物车中添加一个新项目时,我只是将其id附加到现有的cookie值中。在我看来,HttpSession是您用例的正确选择。HttpSessions有一个唯一的标识符,将它们映射到特定的用户。此标识符可以在URL中传递,也可以保存到特定的会话cookie中。默认情况下,一旦浏览器关闭,会话cookie和HttpSession就会丢失,但您可以对此进行更改
<session-config>
   <session-timeout>11520</session-timeout>
   <cookie-config>
     <max-age>11520</max-age>
   </cookie-config>
</session-config>