Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理java.lang.IllegalArgumentException:由cookie值中的控件字符引起_Java_Cookies_Illegalargumentexception - Fatal编程技术网

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

处理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

最近,我部署了一个网站,我在浏览器中存储cookie,产品名称作为cookie值。但有些产品的名称中有控制字符。因此,当这些产品名称保存在cookie中时,会引发由cookie值中的控件字符引起的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或任何其他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),这是一个干净的解决方案。