Tomcat中出现"RFC 7230 and RFC 3986"错误的解决方法
2024-09-05 16:02:40
在用axios从前台向后台发请求时,后台报错
Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
查了一下,是因为高版本tomcat中的新特性:严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了URL中只允许
- 包含英文字母(a-z,A-Z)
- 数字(0-9)
- -_.~4个特殊字符
以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
而本例在传参时,在参数中传了一段JSON,传入的参数中有”{“,且有中文字符,均不在RFC3986中的保留字段中,所以会报这个错。
解决方法:
1、配置tomcat的catalina.properties
添加或者修改:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
这种方法只适合对应的英文,如果含中文则就不行。如果有?和&这些符合那么
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}?&
2、更换Tomcat版本,但是不建议,既然有这个规范就养成习惯去遵守。
3、对相应参数编码后传输到后台再进行解码
JS端,使用encodeURI()方法:
param: encodeURI(something)
Java端,使用URLDecoder.decode()方法解码:
String temp = req.getParameter("param");
temp = URLDecoder.decode(temp, "utf-8");
如果你需要在服务器端加密,可用URLDecoder.encode(),与URLDecoder.decode()作用相反不再赘述。需要注意的是这两个java方法有两个参数,第二个参数是加密方法。不指定加密方式的写法已被废弃。
最新文章
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
- 谈谈LoveLive SIF以及即将诞生的LL练习器
- [翻译]:SQL死锁-阻塞
- BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)
- Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
- MySqL触发器以及常用转换函数注意事项
- iOS推送证书p12转成pem
- HDU 1226 超级密码 (搜素)
- warning: shared library text segment is not shareable
- 项目检出JRE问题(Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'idweb')
- mysql索引结构及其原理
- springboot使用多数据源以及配置
- Django2.X报错-------ModuleNotFoundError: No module named 'django.core.urlresolvers'
- exsi5.5以上版本支持虚拟机的二次虚拟化
- extends 与implements的区别和用法
- WEBBASE篇: 第六篇, CSS知识4
- Windows10下 tensorflow-gpu 配置
- django admim后台不转义提交的html
- C++的string类型和继承C语言风格的字符串的区别与注意事项
- VS2010生成安装包制作步骤 (转)