关于The valid characters are defined in RFC 7230 and RFC 3986问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26975307/article/details/81459826

一、背景

最近在某详情页面需要使用到百度地图相关API,但不能直接写入页面,会和原页面样式冲突,故嵌入了一个单独的html,奈何在IE下(客户多数使用IE)并不是很友好,一直找不到页面。经过各种search(百度,Google,Stack Overflow。。。)找到了问题的根本所在。

 

二、出现原因

 

 

 

 

摘自网友:

①  在tomcat 8.0.35之后 ,tomcat对url的参数做了比较规范的限制,必须按照RFC 7230 and RFC 3986规范,对于非保留字字符,如果不做转义处理,一律都会报The valid characters are defined in RFC 7230 and RFC 3986 错误

②  RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

RFC3986中指定了以下字符为保留字符:

!   *   '   (   )   ;   :   @   &   =   +   $  ,   /   ?   #   [   ]

还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。 
不安全字符有:

->空格    Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉

->引号以及<>    引号和尖括号通常用于在普通文本中起到分隔Url的作用

-># 通常用于表示书签或者锚点

->% 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码

->{}|\^[]`~    某一些网关或者传输代理会篡改这些字符

此处就是json格式的参数在地址栏传递过程中转义出了问题,一半地址中传递的参数含有中文也遇到了此异常。可以对字符串进行编码解决此问题。js编码的函数有: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 。

其中escape()除了 ASCII 字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法,而encodeURI()用于编码整个URI,因为URI中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。

三、解决方案

由于我是将父页面的值传递给子页面,子页面再将父页面路径值按 “&” 符号进行切割,所以我只需要更改拼接符即可(不推荐),但这种并非通用而长久之计,可以有以下几种解决方案:

①   换了个低版本的tomcat

②   遵循7230 and RFC 3986规范,对于非保留字字符做转义操作

③   使用保留字字符

④   将json数据进行urlencode编码

建议从目前的角度出发使用第三种方式降低tomcat版本就可以了,如果从长远出发的话,建议遵循RFC 7230 and RFC 3986规范,对于非保留字字符(json格式的请求参数)做转义操作。

 

猜你喜欢

转载自blog.csdn.net/qq_26975307/article/details/81459826