异常如下:
出现原因:
由于请求了无效字符串,使系统访问不到正确的页面或者错误的请求,例如状态码400提示的一样,“网页提示错误类型400指的是你访问的页面域名不存在或者请求错误。400是一种是HTTP状态码,400 Bad Request。是在打开网页时服务器返回到客户端的一种状态码。显示在客户端的也就是400页面。400页面是当用户在打开网页时,返回给用户界面带有400提示符的页面。 简单来说就是当网页不存在(例如已经被删除了),打开就会出现这个提示。”
我这个是尝试访问路径时,传递了多种特殊字符,例如%\|[{}]等,看网上推荐的方案是:
- 检查输入请求,以了解所有预期的参数和值是否存在。 当参数缺失时,发出适当的错误消息,或使用缺省值。
- 应用程序应验证其输入是否由有效字符组成(解码后)。 例如,应拒绝包含空字节(编码为 %00)、单引号、引号等的输入值。
- 确保值符合预期范围和类型。 如果应用程序预期特定参数具有特定集合中的值,那么该应用程序应确保其接收的值确实属于该集合。 例如,如果应用程序预期值在 10..99 范围内,那么就该确保该值确实是数字,且在 10..99 范围内。
- 验证数据是否属于提供给客户端的集合。
- 请勿在生产环境中输出调试错误消息和异常。
- 将所有的错误信息设定统一的返回页面。
个人解决方案:
由于不想再重构代码方式,我直接采用编辑Tomcat配置进行过滤,在Tomcat目录conf/server.xml下<Connector>标签内添加过滤字符配置:
relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"
标红的位置可根据自己要过滤的字符进行调整
<Connector port="8080" protocol="HTTP/1.1" relaxedPathChars="|{}[],%"
relaxedQueryChars="|{}[],%"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" server="wws1.0"/>
感谢参考资料:
在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
java Web中解决超链接中含有中文的乱码问题 或 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义