处理java.lang.IllegalArgumentException:由cookie值中的Control字符引起

时间:2016-03-30 09:50:00

标签: java cookies illegalargumentexception

最近我部署了一个网站,我将cookie存储在浏览器中,产品名称为cookie值。但有些产品的名称中有控制字符。因此,当这些产品名称保存在cookie中时,会引发由cookie值中的Control字符引起​​的IllegalArgumentException。

 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。

1 个答案:

答案 0 :(得分:0)

关于未来的Cookie,您的解决方案只需{}}}或URL-encode值,然后在Cookie中进行设置,然后在阅读时Base64-encodeURL-decode。< / p>

对于已经“中毒”cookie的现有用户,它尤其取决于您的应用程序设计和框架。

一种方法可能是配置Tomcat以允许这样的值(这可能会产生副作用,具体取决于您使用实际值的方式)。您可能对Base64-decodeALLOW_HTTP_SEPARATORS_IN_V0配置属性感兴趣。

有关所有可调整属性,请参阅此处的规范http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html#Specification

取决于发送的字符(“控制字符”有点模糊:))这可能会起作用。

另一种解决方案是管理客户端问题:只需使用Javascript删除有问题的cookie。 使用ServerCookie.STRICT_NAMING,您只需$ cookies.remove('poisonedCookie'); 如果您不知道哪些cookie有问题,我建议在每个cookie上循环,并在检测到控制字符时删除它。

可能有其他服务器端解决方案(如拦截Angular,检查邮件内容以及是否与Cookie相关,请删除Cookie)但这需要您的应用的更多详细信息+上述其他2个提议可能会以更轻松的方式完成这个伎俩。

另一种解决方案(不太好......)是切换到接受此类字符的Tomcat版本(7之前的任何Tomcat)。但到目前为止,改变tomcat属性肯定是实现这一目标的更好方法