2015-07-21 27 views
0

在我的wicket-project中,我必須添加一個cookie到響應中。所以我生成一個新的cookie並將其添加到WebResponse中。在WebResponse中的addCookie重複Cookie-Header

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 

我發現沒有錯誤在jira的檢票項目,但它可能是一個?或者我做錯了嗎?

+0

什麼方法包含cookie添加代碼? –

+0

我註冊了我的特定RequestCycleListener,在這個監聽器的** onBeginRequest **中,我檢查了我的cookie的請求並添加一個新的,如果它不存在。 – Mabi

回答

1

webResponse.addCookie()只是將Cookie對象添加到ArrayList,所以如果它已經在列表中,再次添加它將在列表中添加第二個實例。您必須將Cookie添加到調用兩次的方法中。這就是你得到其中兩個的原因。

因爲WebResponse沒有提供getCookie()方法,所以您甚至不能檢查是否已添加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; 
} 
+0

這是我檢查的第一件事。如果我的cookie沒有發送,我正在從請求中搜索cookie並添加一個新cookie。我放置了這個檢查,並將cookie添加到我自己的RequestCycleListener的onBeginRequest中。此方法僅在每個請求中調用一次。 – Mabi

+0

有趣。你可以在BufferedHttpServletResponse.addCookie()中設置一個斷點來確定它被調用的次數嗎? –