java.lang.IllegalArgumentException: Control character in cookie value or attribute.

eclipse中有两个项目,一个项目有使用cookie,该项目使用jetty布署,做了一些操作然后关闭。后来使用操作另一个没有使用cookie的项目,使用tomcat7布署,出现问题
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
问题1、刚看到这个问题我很奇怪,因为我的项目没有用上cookie,怎么会提示cookie的错误呢。
原因:因为都是使用本地的浏览器,即使用同一个域名,cookie是根据域名区分的,如果是同一个域名则会把所有的cookie内容带到后台
说明该问题的出现是因为浏览器中有cookie的缓存,其中有些问题导致的。
解决方法:清除浏览器缓存,是OK的,该问题得到解决
问题2、那cookie中到底有什么问题导致的呢,为什么第一个项目中没有出现该问题呢
 原因:tomcat7之后,tomcat有对cookie合法性的校验,cookie中的有效字符为ascii码值在32-127之间,以及制表符\t。而cookie中中文导致该问题.jetty没有该限制所有没问题
问题3、既然cookie设置的有问题,那应该怎么解决呢
设置cookie的时候使用对字符串编码的函数,取cookie的时候进行解码
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 。


escape() 不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。
encodeURI() 不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
encodeURIComponent()该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。


总结:encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号。escape()除了 ASCII 字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法。而encodeURI() 用于编码整个URI,因为URI中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参 数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。

猜你喜欢

转载自blog.csdn.net/beiwulou2994/article/details/80972199
0条评论
添加一条新回复