Wicket WebResponse中的addCookie复制Cookie标头

Wicket WebResponse中的addCookie复制Cookie标头,wicket,Wicket,在我的wicket项目中,我必须在响应中添加cookie。因此,我生成了一个新的cookie并将其添加到WebResponse import javax.servlet.http.Cookie; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebResponse; ... WebResponse webResponse = (WebResponse) Req

在我的wicket项目中,我必须在响应中添加cookie。因此,我生成了一个新的cookie并将其添加到WebResponse

import javax.servlet.http.Cookie;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.WebResponse;

...
WebResponse webResponse = (WebResponse) RequestCycle.get().getResponse();
Cookie cookie = new Cookie("foo", "bar");
webResponse.addCookie(cookie);
...
除了cookie头被设置了两次之外,这是正常工作的

curl -I <myHost>/<myApplication>/
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: foo=bar
Set-Cookie: foo=bar
Date: Tue, 21 Jul 2015 13:54:29 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Pragma: no-cache
Cache-Control: no-cache, no-store
Content-Type: text/html;charset=UTF-8
curl-I//
HTTP/1.1200ok
服务器:ApacheCoote/1.1
设置Cookie:foo=bar
设置Cookie:foo=bar
日期:2015年7月21日星期二13:54:29 GMT
到期时间:1970年1月1日星期四格林威治标准时间00:00:00
Pragma:没有缓存
缓存控制:无缓存,无存储
内容类型:text/html;字符集=UTF-8

我在wicket项目的jira身上没有发现bug,但它可能是bug吗?还是我做错了?

webResponse.addCookie()
只是将Cookie对象添加到
ArrayList
,因此如果它已经在列表中,再次添加它将在列表中添加第二个实例。您必须已将Cookie添加代码放置在一个被调用两次的方法中。这就是为什么你会得到两个

您甚至无法检查Cookie是否已添加,因为WebResponse不提供
getCookie()
方法

您可以做的是在添加Cookie之前清除Cookie:

WebResponse webResponse = (WebResponse) RequestCycle.get().getResponse();

Cookie cookie = new Cookie("foo", "bar");
webResponse.clearCookie(cookie);
webResponse.addCookie(cookie);
如果这不起作用,另一种解决方案是使用标志指示是否已添加Cookie:

private boolean cookieAdded;

...

WebResponse webResponse = (WebResponse) RequestCycle.get().getResponse();

if (!cookieAdded) {
    Cookie cookie = new Cookie("foo", "bar");
    webResponse.addCookie(cookie);
    cookieAdded = true;
}

什么方法包含cookie添加代码?我注册了我的特定RequestCycleListener,在此侦听器的onBeginRequest中,我检查cookie的请求,如果它不存在,则添加一个新的cookie。这是我检查的第一件事。我正在搜索请求中的cookie,如果我的cookie未发送,则添加一个新的cookie。我放置了这张支票,并将cookie添加到我自己的RequestCycleListener的onBeginRequest中。每个请求只调用一次此方法。有趣。能否在BufferedHttpServletResponse.addCookie()中设置断点以确定调用它的次数?