我使用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参数不起作用。
如何限制网络服务的正文大小?
答案 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个键需要整数值,可以使用以下任何一种技术进行设置......
Server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 100000)
$ java -Dorg.eclipse.jetty.server.Request.maxFormContentSize=100000 \
-jar /path/to/jetty-home/start.jar
或
System.setProperty("org.eclipse.jetty.server.Request.maxFormContentSize", "1000000")
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>
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请求是有利的,因为在拒绝的情况下,客户端和服务器不会浪费他们的时间与多余的网络通信。
禁用期望逻辑
curl -H'期待:' - H'转移编码:......' - H'内容类型:......' --data-binary' @ mediumfile'example.com / path -v
在第一个响应数据包之后,按预期发送包含大文件的下一个数据包。