如何为 414 URI Too Large 生成自定义错误响应

How to produce a custom error response for 414 URI Too Large

我最近从 Tomcat 切换到 Jetty,从那以后,我可以在我的日志中看到这种警告。

WARN org.eclipse.jetty.http.HttpParser - URI is too large >65535

WARN org.eclipse.jetty.http.HttpParser - bad HTTP parsed: 414 for HttpChannelOverHttp@34ff28{r=0,c=false,a=IDLE,uri=null}

我正在寻找一种方法来更改发生这种情况时返回的响应(我更喜欢 json 响应而不是默认返回的 HTML 响应)并且不记录警告。这是可以做到的吗?经过一些研究,似乎这个错误在我可以注入一些代码来处理这个问题的任何地方之前被记录下来(例如 servlet 过滤器)

这是称为 "Bad Request" 的错误类别,在传入请求的处理过程中很早发生。

错误请求的一些示例

400 Bad Request              (common)
412 Precondition Failed      (rather esoteric, rare)
413 Request Entity Too Large (very common)
414 URI Too Long             (very common)
431 Requested Header Fields Too Large  (not produced by Jetty, yet)

Bad Request 没有请求 URI,因此无法向下发送到上下文以供该上下文处理。

这些错误请求也没有 header,因此您甚至无法检查 Accept header 来确定是否应该发回响应作为 application/json

人们看到这些响应代码的最常见原因:

  • 端口扫描有问题
  • 客户端正在尝试连接到您的 HTTP 服务器,但它不是 HTTP 客户端(例如:错误配置的电子邮件客户端)
  • 请求是从执行不当的 HTTP 发出的 User-Agent
  • 有人在探测你的服务器漏洞(其中有很多围绕各种请求元数据溢出)
  • 您的服务器(例如 API)的使用超出您所记录的规范(例如:尝试将大型文档作为编码查询字符串发送)