前言:网上查了很多方法,比如给server.xml文件添加属性代码,还有给catalina.properties文件末尾添加代码,测试之后还是没用(泪奔~~~),好了,下面我们直奔主题。
报错原因
当我们跳转网页的时候,浏览器报400,一般是因为前端传的参数类型或名称与后台接收的参数
的实体类的属性类型或名称不匹配,也就是前后台匹配错误
测试过程
这里我们在servlet01文件中将要传递的参数CLASS中包含中文字符
在servlet02文件中正常接收
发现在浏览器运行点击超链接,报错
修改servlet01中CLASS的值为3212
跳转成功!
测试总结:我们发现不同的参数在传递时会产生不同的访问结果。
查询资料后发现,Tomcat7以上版本,严格按照RFC 3986规范进行访问解析,RFC 3986规范定义了URL中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4种特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]),而我的web服务器(tomcat)是9.0的版本所以在传递中文字符时报错了。
解决办法
1、更换低版本Tomcat规避此问题(不建议)
2、去除URL中的特殊字符 (也不建议)
3、我们给URL上的特殊字符定义编码 如图:
成功解决!
--------------------------------------------------------------------------------------------------------------------------------
2022_10_31_补充
解决办法
4、在服务器的server.xml的Connector节点下添加useBodyEncodingForURI="true"属性(就会将当前上传页面的编码作为URL编码,注意:在取出URL中的参数的页面要设置 request.setCharacterEncoding("...");也就是URL参数的解码方式,解码方式要和页面设置的编码方式格式一致,否则会乱码)
---------------------------------------------------------------------------------------------------------------------------------
注:文章为作者笔记,有问题欢迎评论留言!