这个问题纠缠了我很久了,终于在今天早上解决了,感谢自己的不放弃和不断尝试的决心,我坚信,我可以找到解决方式!!

项目用的spring 、spring mvc、hibernate框架,关于统一错误页面在开发的过程中就做过编码,并且一直都很有效,像500,404,403等常规错误码都能得到有效处理,

但是400却不行,而且还暴露tomcat的版本信息,这是很严重的安全漏洞.

先按照网上的说法 将tomcat 8的conf路径下的 catalina.properties 文件进行修改,在最后加入一句:tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

允许tomcat接收“{”这样的特殊字符,重启后问题依然没有解决,又修改nginx配置文件也不行。

接着又查询到:

根据rfc规范,url中不允许有 |,{,}等特殊字符,但在实际生产中还是有些url有可能携带有这些字符,特别是|还是较为常见的。在tomcat升级到7以后,对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

- 8.0.x for 8.0.42 onwards

- 7.0.x for 7.0.76 onwards

这个只是允许出现一些特殊字符,并没有说是全部特殊字符。

后来终于发现是tomcat的版本问题,好像是tomcat7.9以上的版本,都不支持请求链接上带有特殊字符.否则会报400错误,

tomcat请求中包含特殊字符 [] | {} 发送get请求失败:

原因:

这是因为Tomcat严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。传入的参数中有"[]"、"\"不在RFC3986中的保留字段中,所以会报这个错。

400错误的解决方式:

方法一 : 降低tomcat的版本

方法二:  修改server.xml

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars="[]|{}^\`&quot;&lt;&gt;" redirectPort="8443" />

方法三:  修改server.xml

在Host里加入:<Valve className="org.apache.catalina.valves.ErrorReportValve"  showReport="false" showServerInfo="false" />

方法三修改后只会显示出HTTP 400 错误,不会打印堆栈和tomcat版本号信息

关于方法三的解释:

HTTP状态代码提供有关请求的HTTP请求成功完成的信息。HTTP响应分为五个类,如下所示:

  1. 信息回应
  2. 成功的回应
  3. 重新导向
  4. 客户错误
  5. 服务器错误

在这里,我们的目的是使用HTTP响应代码处理HTTP请求时生成的错误/异常。您可以从HTTP状态代码信息中找到有关HTTP状态代码的更多详细信息

错误报告阀是一个错误处理程序,其处理错误状态代码与错误状态码或异常和服务器信息的信息错误页上相应地重定向用户。

错误报告阀用于与Tomcat服务器编写自定义的错误报告处理功能。

在这里,我们将在Catalina(Tomcat)中创建自定义错误报告阀。错误报告阀用于报告错误/异常。因此,如果发生任何错误(例如404,400等),它将处理该错误并为我们提供默认的tomcat页面,如下所示(400错误请求的示例)。

在此上方,它将为您提供状态报告信息(HTTP状态)和服务器信息。因此,您可以在Tomcat服务器的conf 中使用server.xml对其进行配置

默认的Catalina错误报告阀门和配置:org.apache.catalina.valves.ErrorReportValve

属性 描述
showReport 如果发生错误,用于在错误页面上显示错误信息(状态代码及其信息)的标志。默认值是true
showServerInfo 如果发生任何错误,则用于在错误页面上显示当前服务器信息的标志。默认值是true

现在,添加/更新以下内容以在<Host> 中的server.xml中进行配置。

<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />

现在,使用上述配置,您将发现以下内容。(仅HTTP状态代码)。

注意:同时禁用showServerInfo和showReport只会返回HTTP状态代码,并从默认响应中删除所有CSS。

参考地址:https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/

tomcat8 url包含|等特殊字符报错400的问题的更多相关文章

  1. tomcat8踩坑:url包含|等特殊字符报错400的问题

    这个问题纠缠了我很久了,终于在今天早上解决了,感谢自己的不放弃和不断尝试的决心,我坚信,我可以找到解决方式!! 项目用的spring boot+spring security框架,关于统一错误页面在开 ...

  2. RSS阅读器“阅读原文”报错400

    问题 使用SpringMVC框架,实现了RSS订阅,在FoxMail的RSS订阅页面,点击[阅读原文],报错400 . 每个RSS文章的链接是:https://jiashubing.cn/forum/ ...

  3. IE浏览器url中带中文报错的问题;以及各种兼容以及浏览器问题总结

    1.解决IE浏览器url带中文报错 /* encodeURI()解决IE浏览器请求url中带中文报错的问题 */ URL = encodeURI("<%=basePath%>ve ...

  4. gitlab使用URL导入远程仓库报错

    gitlab使用URL导入远程仓库报错Import url is blocked: Only allowed ports are 80,443, and any over 1024 报错内容为Impo ...

  5. Tomcat8升级后URL中特殊字符报错出现原因

    请求带上花括号等字符,请求无法送达服务端,报错: Failed to load resource: the server responded with a status of 400 () https ...

  6. ajax 调用 .net core WebAPI,报错 400 (Bad Request) Unexpected character encountered while parsing value

    此文由博主前两天的提问及 dudu 的回答整理,地址:https://q.cnblogs.com/list/myquestion 情况说明 基于 .net core 写了一个 Web API,用 po ...

  7. Cocos2dx 3.x包含ext库报错解决

    之前使用cocos2dx 3.6版本中用到了ext库中的一些东西,使用visual studio 2013,编译的时候报错: 无法打开包括文件:“extensions/ExtensionMacros. ...

  8. svn报错 400 Bad Request

    MyEclipse中的svn,commit经常报错 Error: Commit failed (details follow):  Error: At least one property chang ...

  9. 分区表主键不包含分区键报错ERROR 1105 (HY000)

    ERROR 1105 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function MySQ ...

随机推荐

  1. 使用Qemu运行Ubuntu文件系统 —— 搭建SVE学习环境(2)

    开发环境 PC:ubuntu18.04 Qemu:4.1 Kernel:Linux-5.2 概述 由于要学习ARM的SVE技术,但是目前还没有支持SVE指令的板子,所以只能用Qemu来模拟,但是发现Q ...

  2. AtCoder Grand Contest 038题解

    好久没更了 写点东西吧= = A 01Matrix 简单构造 左上角和右下角染成1其他染成0即可 #include<bits/stdc++.h> #define ll long long ...

  3. IEnumerable、IEnumerator接口(如何增加迭代器功能)

    IEnumerable.IEnumerator接口封装了迭代器功能,有了它,我们不需要将内部集合暴露出去,外界只需要访问我的迭代器接口方法即可遍历数据. 在C#中,使用foreach语句来遍历集合.f ...

  4. JavaScript instanceof深度剖析以及Object.prototype.toString.call()使用

    本文由segementfalt上的一道instanceof题引出: var str = new String("hello world"); console.log(str ins ...

  5. Python——IO多路复用之select模块select方法

    Python——IO多路复用之select模块select方法 使用select模块的select方法实现Python——IO多路复用 实现同时将终端输入的文本以及客户端传输的文本写入文本文件中: w ...

  6. shell脚本显示字体颜色

    shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如: ec ...

  7. zabbix php-fpm监控

    #!/bin/bash################################### Zabbix monitoring script## php-fpm:# - anything avail ...

  8. Scala 在挖财的应用实践

    编者按:本文是根据ArchSummit 大会上挖财资深架构师王宏江的演讲<Scala 在挖财的应用实践>整理而成. 这次分享有三个方面,一是介绍一下挖财当前的开发情况和后端的架构, 二是挖 ...

  9. 聊聊对称/非对称加密在HTTPS中的使用

    目前常用的加密算法主要分成三类: 对称加密算法 非对称加密算法 消息摘要算法 在互联网中,信息防护主要涉及两个方面:信息窃取和信息篡改.对称/非对称加密算法能够避免信息窃取,而消息摘要算法能够避免信息 ...

  10. ASP.NET之MVC 微信公众号授权给第三方平台的技术实现流程(获取第三方平台access_token)

    “出于安全考虑,在第三方平台创建审核通过后,微信服务器每隔10分钟会向第三方的消息接收地址推送一次component_verify_ticket,用于获取第三方平台接口调用凭据”.这是文档中的原话,也 ...