2016-03-30 18 views
0

最近,我部署了一個網站,將cookie存儲在瀏覽器中,產品名稱作爲cookie值。但有些產品的名稱中有控制字符。因此,當這些產品名稱保存在Cookie中時,會拋出Cookie值中的控制字符導致的IllegalArgumentException。處理java.lang.IllegalArgumentException:由cookie值中的控制字符引起

java.lang.IllegalArgumentException: Control character in cookie value or attribute. 
     at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:169) 
     at org.apache.tomcat.util.http.Cookies.getTokenEndPosition(Cookies.java:493) 
     at org.apache.tomcat.util.http.Cookies.doProcessCookieHeaderOriginal(Cookies.java:283) 
     at org.apache.tomcat.util.http.Cookies.processCookieHeader(Cookies.java:233) 
     at org.apache.tomcat.util.http.Cookies.processCookies(Cookies.java:141) 
     at org.apache.tomcat.util.http.Cookies.getCookieCount(Cookies.java:107) 
     at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1163) 
     at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:914) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:532) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
     at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 

一些想法在我腦海中,我必須在存儲在cookie之前編碼名稱。

但問題是,許多用戶已經遇到問題,無法瀏覽該網站。

是否有任何方法可以在不更改cookie值的情況下處理異常,或者有任何方法可以刪除有問題的舊cookie或其他任何其他方法。

回答

0

關於未來的餅乾,您的解決方案是簡單地URL-encodeBase64-encode在Cookie設置之前的值,然後URL-decodeBase64-decode它在讀取。

關於現有用戶「中毒」Cookie,它主要取決於您的應用程序設計和框架。

一種方法可能是配置Tomcat以允許這樣的值(根據您如何使用實際值可能有副作用)。您可能對ALLOW_HTTP_SEPARATORS_IN_V0ServerCookie.STRICT_NAMING配置屬性感興趣。

查看這裏的規格http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html#Specification所有的可調性質。

根據發送的字符(「控制字符」有點含糊:)),這可能會訣竅。

另一種解決方案是管理客戶端問題:簡單地用Javascript刪除有問題的cookie。 隨着Angular你可以簡單地$ cookies.remove('poisonedCookie'); 如果您不知道哪些cookies有問題,我建議循環使用它們中的每一個,並在檢測到控制字符時將其刪除。

可能還有其他服務器端解決方案(例如攔截IllegalArgumentException,檢查郵件內容以及是否與cookie相關,刪除cookie),但這需要您的應用程序的更多細節+上述兩個命題可能會做的更多細節更簡單的方法。

另一個解決方案(不是很好..)是切換到接受這種字符的Tomcat版本(7之前的任何Tomcat)。但改變tomcat的屬性當然是一個更好的方法來實現這一點,到目前爲止

+0

我怎樣才能運行JavaScript,而該網站處於例外模式? –

+0

啊哈哈,我必須承認客戶端修復沒有意義! 顯然我會深入Tomcat的屬性(特別檢查我突出顯示的2),這是一個乾淨的解決方案。 – niilzon

相關問題