码头和最大内容大小

Jetty and max content size

我使用 Jetty 9.4.8,我想限制可以 post 服务器的数据量。为此,我添加到 jetty.xml:

<Call name="setAttribute">
  <Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg>
  <Arg>10000</Arg>
</Call>

我像这样测试了码头(请求-xxlarge.xml - 文本文件(20mb)):

curl -X POST --data @request-xxlarge.xml http://localhost:8080/test -v

结果我得到了

*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /test HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 21232818
> Content-Type: application/x-www-form-urlencoded
> Expect: 100-continue
> 
< HTTP/1.1 200 OK
< Content-Length: 4
< Connection: close
< Server: Jetty(9.4.8.v20171121)
< 
* Closing connection 0
POST

服务器处理了请求

已编辑

服务器 returns 413 当 Content-Type:application / x-www-form-urlencoded。

但是如果我希望它是一个 Web 服务并且我想处理 Content-Type: application / soap + xml - 那么 maxFormContentSize 参数不起作用。

如何限制 Web 服务正文的大小?

不确定你的问题是什么,但我会试一试。

###理论### Expect: 100-continue header 在 HTTP 1.1 中指定并允许服务器在发送 header 之后但在客户端启动之前立即确认或拒绝 POST/PUT 请求发送可能大量的实际数据(请求的 body)。因此,符合要求的客户端必须在发送数据之前等待 HTTP/1.1 100 Continue。此方案对于较大的 POST/PUT 请求是有利的,因为在拒绝的情况下,客户端和服务器不会将时间浪费在多余的网络通信上。

###可能的解决方案###

  1. 禁用期望逻辑

    curl -H 'Expect:' -H 'Transfer-Encoding: ...' -H 'Content-Type: ...'
    --data-binary '@mediumfile' 例子。com/path -v

  2. 在第一个响应数据包之后发送下一个包含大文件的数据包。

更多信息在这里:https://www.rfc-editor.org/rfc/rfc7231#section-5.1.1

Jetty 可以根据特定 Content-Type 值对请求正文内容施加 3 个限制。

Content-Type: application/x-www-form-urlencoded

这是标准的 html <form> 提交,通过 HttpServletRequest.getParameter(String key) API.

访问提交的表单

这种请求正文内容可以通过两种不同的方式进行过滤。

org.eclipse.jetty.server.Request.maxFormContentSize - 这是对请求正文内容的总大小(以字节为单位)的限制。

org.eclipse.jetty.server.Request.maxFormKeys - 这是对所提交表单的表单键总数的限制。

以上 2 个键需要整数值,并且可以使用以下任何技术设置...

1) 作为适用于所有部署的 webapps 的服务器属性

Server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 100000)

2) 作为一个系统 属性 适用于所有已部署的 webapps

$ java -Dorg.eclipse.jetty.server.Request.maxFormContentSize=100000 \
       -jar /path/to/jetty-home/start.jar

System.setProperty("org.eclipse.jetty.server.Request.maxFormContentSize", "1000000")

3) 作为已部署的上下文参数 WebAppContext

在您的${jetty.base}/webapps/<context>.xml中您可以设置这些值

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
    "http://www.eclipse.org/jetty/configure_9_3.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/mycontext</Set>
  <Set name="war"><Property name="jetty.webapps"/>/mycontext.war</Set>

  <Set name="maxFormKeys">100</Set>
  <Set name="maxFormContentSize">202020</Set>
</Configure>

Content-Type: multipart/form-data

这也是上面的标准表单提交,但数据也可以通过 HttpServletRequest.getPart(String name) APIs 访问。

此类数据通过目标 Servlet 的 @MultipartConfig 值(或 <servlet><multipart-config> 元素的 WEB-INF/web.xml 条目)存在的配置受到限制

要通过整个请求大小限制此类内容类型,请使用 maxRequestSize 配置。

所有其他请求 Content-Type 个条目

对于所有其他 Content-Type 值,servlet 规范和 Jetty 不参与解析或限制大小。

如果您正在使用一个库来处理您的请求(REST、SOAP 等),请检查该库以查看它是否具有基于大小或其他原因拒绝请求的机制(例如:不是 well-formed,缺少 expected/required 数据等)。

一如既往,如果您需要某个功能,请随时在 Eclipse Jetty 问题跟踪器上请求它,网址为 https://github.com/eclipse/jetty.project/issues