JAVA -tomcat- 请求头太大

Posted

技术标签:

【中文标题】JAVA -tomcat- 请求头太大【英文标题】:JAVA -tomcat- Request header is too large 【发布时间】:2017-02-04 20:02:40 【问题描述】:
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
    at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:512)
    at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501)
    at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:171)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:996)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:722

如何在我的 Spring Web 应用程序中解决这个问题?

我已经浏览过这个帖子Request header is too large

【问题讨论】:

提示:我猜这与 eclipse 无关。 您是否捕获了此请求的 http 数据包并尝试查看标头? 我认为无论eclipse @GhostCat如何,都应该在tomcat中进行一些配置更改 我需要知道哪些配置更改以及我需要在我的 spring 应用程序或 tomcat 中进行哪些更改? @Himanshu 【参考方案1】:

问题来了,HTTP 标头有限制吗?答案是没有限制,但即使在 POST 请求中,网络服务器也会限制其传入的请求标头大小,因此我们得到 413(请求标头太大)。此限制包括请求行和标头字段。

http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestfieldsize

https://tomcat.apache.org/tomcat-5.5-doc/config/http.html

http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers

Maximum on http header values?


就我而言,我有 SpringBoot 1.5.8 并使用 HTTP POST,但是我必须添加:

server.max-http-header-size=10000000 

在 application.properties 中。

【讨论】:

我将 MB 添加到大小值 10000000 以获得 10000000MB。因为它给出了以下错误无法将'server.max-http-header-size'下的属性绑定到org.springframework.util.unit.DataSize: 10000000MB 差不多是 10TB,你打算在 header 中发送 10TB 吗? 我只是指出我必须将 MB 添加到值中才能为我工作我使用 1MB 我不得不改用 server.tomcat.max-http-header-size【参考方案2】:

解决了! 我使用的是 HTTP GET 而不是 HTTP POST。 从技术上讲,如果 URL 长度超过 2000 个字符,我已经看到 HttpGet 会出现问题。在这种情况下,最好使用 HttpPost 或拆分 URL。 浏览器限制在 2kb - 8kb

Tomcat: Request header Too large

【讨论】:

【参考方案3】:

请求和响应 HTTP 标头的最大大小,在 字节。如果未指定,则此属性设置为 4096 (4 KB)。

为避免出现Error parsing HTTP request header 错误,您可以通过这样做来增加以下值。

转到以下位置:$TOMCAT_HOME/conf/server.xml

server.xml 中更改HTTP/1.1 Connector 条目并将maxHttpHeaderSize 设置为“65536”(64Kb 字节),如下所示:

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />

或者

您可以使用 POST 方法,根据 Tomcat,它最多可以携带 2 兆字节。

将由 POST 处理的最大字节数 容器FORM URL参数解析。可以通过以下方式禁用限制 将此属性设置为小于或等于 0 的值。如果不是 指定时,此属性设置为 2097152(2 兆字节)。

希望这些信息对您有所帮助..

【讨论】:

【参考方案4】:

application.properties 中使用 Spring Boot 2.4:

server.max-http-header-size=10MB

【讨论】:

【参考方案5】:

这与 POST 或 GET 无关,而是您的应用程序使用的 Tomcat 的标头大小限制设置。

您始终可以使用以下应用程序属性来控制和配置它: server.tomcat.max-http-header-size=1024

其中 1024 以字节为单位。

【讨论】:

这里的许多答案似乎混淆了标头和查询字符串/请求正文。 对于 Springboot 2.x server.max-http-header-size=1KB【参考方案6】:

我知道这是一个旧帖子。不过,我认为澄清一些问题是件好事。

使用 _server.tomcat.max-http-header-size=max_wanted_size_ 参数,您可以将服务器更改为接受 max_wanted_size,但即使您将其设置为 10Mb,浏览器也会将您的请求参数减少到浏览器限制大小。我在 chrome 中尝试过,它似乎在 150-200kb 左右。 java.lang.IllegalArgumentException 发生在服务器中,与浏览器无关。因此,更改 server.tomcat.max-http-header-size 应该足够好,并且在使用 GET 方法时会发生这种情况,但在使用 POST 方法时也会发生这种情况(在 POST 情况下,应更改 maxPostSize 参数)。

【讨论】:

【参考方案7】:

这是一个旧帖子 - 但任何想要改变的人 最新 Spring Boot 中的 server.max-http-header-size(版本 >=2.1) - 应在 Datasize 可解析值中提供值 例如 - server.max-http-header-size=64KB

【讨论】:

【参考方案8】:

我将为这个问题添加一个不同的“答案”:问题可能是 cookie 太多或太大,在访问网站的用户的浏览器中出现错误。

虽然大多数人(可以理解)专注于如何将 Tomcat 更改为 ALLOW 更大的标头,但我会指出,在我遇到此错误的情况下,我可以使用我的浏览器开发工具以某种方式看到它是大量 cookie 被发送到产生错误的站点。 (它们似乎有点像我觉得服务器上的某些东西错误地创建了这么多,因为它们命名为彼此几乎重复,具有重复值。)

我清除了此站点的 cookie(使用浏览器开发工具),现在我没有收到错误消息。当然,清除 cookie 可能会导致退出网站等问题。在我的情况下,这是为了能够再次使用该网站而付出的小代价。

我留下这个以防其他人有一天会遇到它,或者是收到错误的人(就像我一样)或者是用户报告错误的服务器管理员,他们可以要求他们考虑清除他们网站的 cookie (当然,有很多方法和网站可以提供帮助)。

【讨论】:

【参考方案9】:

在我的例子中,我将 blob 图像显示为 URL 路径 &lt;img src="example.com/extremely-long-base64-encoded-string"&gt; 而不是 &lt;img scr="data:;base64,extremely-long-base64-encoded-string"&gt;

您注意到不同之处,这就是导致错误INFO: Error parsing HTTP request header java.lang.IllegalArgumentException: Request header is too large的原因

【讨论】:

【参考方案10】:

我在使用 Spring Boot 应用程序时遇到了同样的错误。我只是将数据发送方式更改为使用查询参数中的 Postman 表单数据,问题已经解决。

【讨论】:

【参考方案11】:

我刚刚在尝试为 NetBeans IDE 调试运行 con localhost tomcat 的 Web 应用程序时遇到了这个问题。

在我找到任何解决方案之前,从 Firefox 中尝试过,但没有出现问题。

原来 Chrome 正在发送一些 cookie 值并达到了一些配置的限制。

刚刚从 Chrome 的开发者工具中删除了 localhost 的 cookie 并解决了问题。

【讨论】:

【参考方案12】:

在我的例子中,我有一个 Spring Boot 应用程序,它用于根据请求 URL 重定向到另一个码头应用程序。我不得不在这两个地方修改它。

春季启动

server.max-http-header-size=20000

码头

如下所示设置属性 requestHeaderSize 的值。

   <Call name="addConnector">
      <Arg>
          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
            <Set name="host"><Property name="jetty.host" /></Set>
            <Set name="port"><Property name="jetty.port" default="8080"/></Set>
            <Set name="maxIdleTime">300000</Set>
            <Set name="requestHeaderSize">20000</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <Set name="confidentialPort">8443</Set>
            <Set name="lowResourcesConnections">20000</Set>
            <Set name="lowResourcesMaxIdleTime">5000</Set>
          </New>
      </Arg>
    </Call>

【讨论】:

以上是关于JAVA -tomcat- 请求头太大的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程请求头丢失

java获取request的请求头信息

java 获取request请求头所有信息

java 怎么修改servlet的请求头信息

直播系统源码,java 获取request请求头所有信息

java获取request的请求头信息