Jetty和最大内容大小

时间:2018-03-12 05:57:50

标签: jetty jetty-9

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

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

我测试了jetty(request-xxlarge.xml - text file(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

服务器处理了请求

EDITED

当Content-Type:application / x-www-form-urlencoded时,服务器返回413。

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

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

2 个答案:

答案 0 :(得分:2)

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

内容类型: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

上的Context参数

${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>

内容类型:multipart/form-data

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

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

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

所有其他请求内容类型条目

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

如果您正在使用库来处理您的请求(REST,SOAP等),那么请检查该库是否有基于大小或其他原因拒绝请求的机制(例如:格式不正确,缺少预期/需要的数据等。)

与往常一样,如果您想要一个功能,请随时在Eclipse Jetty问题跟踪器上请求它 https://github.com/eclipse/jetty.project/issues

答案 1 :(得分:0)

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

理论

Expect: 100-continue标头在HTTP 1.1中指定,允许服务器在发送标头之后但在客户端开始发送潜在的大量实际数据之前立即确认或拒绝POST / PUT请求(请求的正文)。因此,符合标准的客户端必须在发送数据之前等待HTTP/1.1 100 Continue。这种方案对于更大的POST / PUT请求是有利的,因为在拒绝的情况下,客户端和服务器不会浪费他们的时间与多余的网络通信。

可能的解决方案

  1. 禁用期望逻辑

    curl -H'期待:' - H'转移编码:......' - H'内容类型:......'     --data-binary' @ mediumfile'example.com / path -v

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

  3. 此处有更多信息:https://tools.ietf.org/html/rfc7231#section-5.1.1