零、简单粗暴,更换Tomcat版本为能识别的版本
该点参考自博主 Carino_U 文章 https://blog.csdn.net/Carino_U/article/details/78973120
根据rfc规范,url中不允许有 |,{,}等特殊字符,但在实际生产中还是有些url有可能携带有这些字符,特别是|还是较为常见的。在tomcat升级到8以后,对url字符的检查都变严格了,如果出现这类字符,tomcat将直接返回400状态码。
后来有人对此提出了异义,见: https://bz.apache.org/bugzilla/show_bug.cgi?id=60594
经过一番讨价还价,tomcat的开发人员增加一项设置,允许配置在url可以出现的特殊字符,但也仅限于|,{,}三种,见:http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html#Other
该项设置在以下版本的tomcat中有效:
- 8.5.x for 8.5.12 onwards https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.12/bin/
- 8.0.x for 8.0.42 onwards https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.42/bin/
- 7.0.x for 7.0.76 onwards https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.76/bin/
一、对URL进行转码解决特殊字符
使用URLEncoder、URLDecoder进行URL参数的转码与解码
encodeURIComponent() 用于参数的传递,参数包含特殊字符可能会造成间断。encodeURIComponent方法返回一个已编码的 URI。如果您将编码结果传递给,那么将返回初始的字符串。因为encodeURIComponent方法对所有的字符编码,请注意,如果该字符串代表一个路径,例如/folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到 web 服务器时将是无效的。
encodeURI()用于整个url编码,如果字符串中包含不止一个 URI 组件,请使用encodeURI方法进行编码。encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
二、修改Tomcat的配置文件,使其零时支持特殊符号
修改tomcat的conf文件夹下的catelina.properties文件,拖到最后,启用该配置,我需要用到{},所以增加了{}
emmm,不过这样修改后,后面有时更新的话重新加载配置,所有配置会重置,年少时的我这样做之后,天天频繁修改这个配置,这酸爽不说也罢,每每想起还会在晚上做噩梦,垂死病中惊坐起!