【问题标题】:Tomcat: custom error page instead of empty responseTomcat:自定义错误页面而不是空响应
【发布时间】:2018-09-07 15:44:51
【问题描述】:

Tomcat 以 empty HTTP 400 响应拒绝了一些请求。

几个例子:

包含未编码字符的请求 url(例如,自 Tomcat 8.5.x 起为“[”或“]”)触发器:

INFO  o.a.c.h.Http11Processor   Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

例如当标头过大时,也会返回 400 错误页面:

INFO: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Request header is too large

是否可以为这些错误提供自定义错误页面?更一般地,当 Tomcat 触发此 HTTP 400 响应时。提供空洞的响应是最糟糕的用户体验。我知道应避免创建此类请求,但我仍在寻找备用方案。

我已经在我的(嵌入式)Tomcat 上下文中设置了一个自定义错误页面,其中ctx.addErrorPage(...) 的错误代码为400

当从我的 webapp 触发时,它可以正常工作。 例如。当将错误处理委托给 servlet 错误处理机制时,res.sendError(SC_BAD_REQUEST); - resHttpServletResponse

很遗憾,对于顶部描述的那种 tomcat 错误,没有使用自定义错误页面。

谢谢!

【问题讨论】:

  • 你看过here吗?
  • 是的,但正如我提到的,我的 400 自定义错误页面的配置通常可以正常工作。但是,当 Tomcat 触发我列出的示例中的错误时,不使用它。

标签: java http tomcat response


【解决方案1】:

这对我来说也很麻烦。不幸的是,从查看源代码来看,它似乎与 Tomcat 的内部结构密切相关,并且无法轻易更改。

特别是,您注意到的异常会在 org.apache.coyote.http11.Http11InputBuffer 中引发,这是 Tomcat 组件之一的一部分,称为 Coyote HTTP/1.1 Connector(旧文档,新文档没有这个):

Coyote HTTP/1.1 连接器元素表示一个连接器组件 支持 HTTP/1.1 协议。它使 Catalina 能够正常工作 作为一个独立的网络服务器,除了它的执行能力 servlet 和 JSP 页面。

此外,异常以catalina.log 结尾并且非常短 - 将其与从 JSP 处理器收到异常时比较,后者的大小是该处理器的几倍。

所以我认为修补这个问题并非易事——至少在我不了解 Tomcat 内部结构的情况下并非如此 :(

【讨论】:

  • 我很高兴看到我不是唯一一个为此苦苦挣扎的人!
猜你喜欢
  • 2011-04-20
  • 2013-06-08
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2020-01-21
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多