5

我正在使用 Jetty 7.6 和 Scalatra Web 框架。在一些请求中,我需要向客户端发送一个大文本作为响应正文,我使用 HttpServletResponse.getWriter() 来编写响应。

我注意到在客户端我收到 413 Header Full 错误。显然,在 Jetty 中解决此问题的一种方法是增加 jetty 的 header-buffer-size 值。

我想知道 HttpServletResponse.getWriter() 与请求标头的大小有什么关系?!据我了解 HttpServletResponse.getWriter() 写入响应正文而不是响应标头。

如果有人可以解释这个问题,我将不胜感激。

4

3 回答 3

6

不幸的是,这不仅仅是重要的标题(如 joakime thougth)。Jetty 有一个用于标头的缓冲区和一个用于请求的缓冲区。

  • 如果完整的请求(http 数据流)适合听者的缓冲区,则没有问题。
  • 如果它超过了头部的缓冲区,请求缓冲区将是用户的。
  • 如果它超过了请求缓冲区,那么你会得到一个状态为 413 的标准 Http 响应。

答案有相同的东西(缓冲区),但希望 Http 旨在发送“分块”响应。

我在上传时面临同样的问题。

我发现您可以设置这些缓冲区的大小。请参阅:http: //download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/server/nio/SelectChannelConnector.html

http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/server/nio/AbstractNIOConnector.html

http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/server/AbstractConnector.html#setRequestHeaderSize(int )

您可以使用 jetty.xml 文件来执行此操作:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"     "http://jetty.mortbay.org/configure.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
 <Call name="addConnector">
  <Arg>
   <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
    <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
    <Set name="requestHeaderSize">8192</Set>
   </New>
  </Arg>
 </Call>
</Configure>
于 2012-08-14T08:14:00.660 回答
3

HTTP 响应代码 413是 HttpStatus。REQUEST_ENTITY_TOO_LARGE

它与您的 HttpServletResponse.getWriter() 无关。

捕获并检查请求标头,您正在向服务器发送不合理数量的标头。

于 2012-08-11T13:30:48.810 回答
2

如果您正在使用或升级到 Jetty 9,他们已经删除了 SelectChannelConnector。这是更新的 jetty.xml -

<New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
  <Set name="requestHeaderSize">8192</Set>      
</New> 

<Call name="addConnector">
  <Arg>
    <New class="org.eclipse.jetty.server.ServerConnector">
      <Arg name="server"><Ref id="Server" /></Arg>
      <Arg name="factories">
        <Array type="org.eclipse.jetty.server.ConnectionFactory">
          <Item>
            <New class="org.eclipse.jetty.server.HttpConnectionFactory">
              <Arg name="config"><Ref id="httpConfig" /></Arg>
            </New>
          </Item>
        </Array>
      </Arg>
      <Set name="port">8080</Set>
    </New>
  </Arg>
</Call>

请参阅http://www.eclipse.org/jetty/documentation/current/configuring-connectors.html

于 2013-10-09T19:13:55.270 回答