处理java.lang.IllegalArgumentException:由cookie值中的控件字符引起
最近,我部署了一个网站,我在浏览器中存储cookie,产品名称作为cookie值。但有些产品的名称中有控制字符。因此,当这些产品名称保存在cookie中时,会引发由cookie值中的控件字符引起的IllegalArgumentException处理java.lang.IllegalArgumentException:由cookie值中的控件字符引起,java,cookies,illegalargumentexception,Java,Cookies,Illegalargumentexception,最近,我部署了一个网站,我在浏览器中存储cookie,产品名称作为cookie值。但有些产品的名称中有控制字符。因此,当这些产品名称保存在cookie中时,会引发由cookie值中的控件字符引起的IllegalArgumentException java.lang.IllegalArgumentException: Control character in cookie value or attribute. at org.apache.tomcat.util.http.Coo
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 关于未来的cookie,您的解决方案只是在cookie中设置值之前对值进行
URL编码
或Base64编码
,然后在读取时对其进行URL解码
或Base64解码
对于已经“毒害”cookie的现有用户,这主要取决于您的应用程序设计和框架
一种方法是将Tomcat配置为允许这些值(这可能会产生副作用,具体取决于您如何使用实际值)。您可能对\u V0
中的允许\u HTTP\u分隔符\u或服务器cookie.STRICT\u命名
配置属性感兴趣
有关所有可调整属性,请参见此处的规格
根据发送的字符(“控制字符”有点模糊:),这可能会起作用
另一个解决方案是管理客户端问题:只需使用Javascript删除有问题的cookie。
使用Angular
您可以简单地$cookies.remove('毒物cookie');
如果您不知道哪些cookie有问题,我建议在每个cookie上循环,并在检测到控制字符时将其删除
可能还有其他服务器端解决方案(如拦截IllegalArgumentException
,检查消息内容,如果消息内容与cookie相关,则删除cookie),但这需要您的应用程序的更多详细信息+上述另外两个建议可能更容易实现
另一个解决方案(不是很好…)是切换到接受这些字符的Tomcat版本(7之前的任何Tomcat)。但是更改tomcat属性肯定是实现这一点的更好方法,到目前为止当站点处于异常模式时,我如何运行javascript?哈哈,我必须承认客户端修复毫无意义!显然,我会深入研究Tomcat属性(特别是我强调的2),这是一个干净的解决方案。