2016-12-30 109 views
2
餅乾

最近我遇到奇怪的問題與cookies發送到我的後端服務器(這是使用CXF 3.1.2處理HTTP請求),它拋出一個異常:CXF問題與使用Chrome

java.lang.IllegalArgumentException: Cookie is malformed : 
     at org.apache.cxf.jaxrs.impl.CookieHeaderProvider.fromString(CookieHeaderProvider.java:66) ~[cxf-rt-frontend-jaxrs-3.1.2.jar:3.1.2] 
     at org.apache.cxf.jaxrs.impl.CookieHeaderProvider.fromString(CookieHeaderProvider.java:26) ~[cxf-rt-frontend-jaxrs-3.1.2.jar:3.1.2] 
     at javax.ws.rs.core.Cookie.valueOf(Cookie.java:126) ~[javax.ws.rs-api-2.0.1.jar:2.0.1] 
     at org.apache.cxf.jaxrs.impl.HttpHeadersImpl.getCookies(HttpHeadersImpl.java:117) ~[cxf-rt-frontend-jaxrs-3.1.2.jar:3.1.2] 
     at org.apache.cxf.jaxrs.impl.AbstractRequestContextImpl.getCookies(AbstractRequestContextImpl.java:59) ~[cxf-rt-frontend-jaxrs-3.1.2.jar:3.1.2] 
     at com.acmecorp.acmeproject.whitelist.filter.AuthenticationInFilter.filter(AuthenticationInFilter.java:34) ~[AuthenticationInFilter.class:na] 
     at org.apache.cxf.jaxrs.utils.JAXRSUtils.runContainerRequestFilters(JAXRSUtils.java:1636) ~[cxf-rt-frontend-jaxrs-3.1.2.jar:3.1.2] 

當我使用Chrome或Opera時,偶爾會發生這種情況,但這並未在Firefox或IE中重現。 在CXF日誌我找到下一個HTTP標頭被髮送到服務器:

接頭:{接受= [應用/ JSON,文本/無格式,/],接受編碼 = [gzip的,放氣,lzma], Accept-Language = [en-US,en; q = 0.8],Cookie = [BlueStripe.PVN = 300d00000051; APP_USER =「test_user1」; ; SMSESSION =(省略)]}

問題是在它們之間有空格的標題中使用雙分號。 CXF將它視爲沒有名稱和沒有值的cookie並引發異常。

此問題可能與Siteminder SMSESSION Cookie有關,每隔一分鐘左右過期一次。

任何幫助將不勝感激。

+0

您是否檢查了答案?正如我所說,不可能在沒有看到客戶代碼 – pedrofb

+0

Pedrofb的情況下完全回答,我非常感謝您的幫助。將盡力挖掘這個問題並儘快給出答覆。謝謝。 – stinger

+0

我發現這個問題可能與我們用於實現SSO的Siteminder有關。它添加了SMSESSION cookie來請求並每分鐘更改一次。而這個異常只發生在這個時間間隔,當Siteminder應該更新一個SMSESSION cookie值(我提交HTTP請求與舊的cookie值,它攔截請求和更改cookie,但留空白值''導致CXF崩潰) – stinger

回答

1

有效Cookie:RFC6265根據頭應該是

Cookie: name=value *(; name=value) 

一個或多個name=value對由分號和空間;分離。您的Cookie無效,因爲第三項無效。

在服務器端,CXF CookieHeaderProvider.fromString(cookie)將拋出IllegalArgumentException,因爲名稱/值爲空。這不是一個CXF的錯誤,因爲cookie不符合規範

我還沒有發現任何相關的bug Chrome issue list,所以我懷疑是客戶的問題

下一步就是確定哪裏是beign包括空白餅乾;

  1. 調試調用之前的客戶端代碼,看看當前的一組Cookie
  2. 檢查HTTP請求頭,並檢查Cookie:

如果您發佈客戶端代碼和調試器結果會很有幫助