响应标头太大 - Jetty 嵌入式版本 9

2024-03-13

使用 Jetty 时,出现“响应标头太大”的异常,该异常仅在客户端的大小达到时才会抛出jsonValue很大(大于 1500 字节)。如果jsonvalue较小,一切正常。

这是我的代码,非常简单。

服务器代码:

Server server = new Server(8080);
ServletHandler handler = new ServletHandler();
server.setHandler(handler);

handler.addServletWithMapping(StoreServlet.class, "/store");

server.start();
server.join();

StoreServlet类代码:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
    response.setStatus(HttpServletResponse.SC_OK);
    response.getWriter().println("<h1>Store SimpleServlet</h1>");
}

客户端代码:

HttpClient httpClient = new HttpClient();
httpClient.start();

ContentResponse response = httpClient.POST("http://0.0.0.0:" + host.getPort() + "/store").param("p", jsonValue).send();

静态跟踪:

java.util.concurrent.ExecutionException: java.io.IOException: Response header too large
    at org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118)
    at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:101)
    at org.eclipse.jetty.client.HttpRequest.send(HttpRequest.java:589)
    at com.paywithbytes.communication.http.client.HttpClientHelper.doPost(HttpClientHelper.java:54)
    at com.paywithbytes.communication.http.client.HttpClientHelper.main(HttpClientHelper.java:35)
Caused by: java.io.IOException: Response header too large
    at org.eclipse.jetty.http.HttpGenerator.generateRequest(HttpGenerator.java:249)
    at org.eclipse.jetty.client.http.HttpSenderOverHTTP.sendHeaders(HttpSenderOverHTTP.java:78)
    at org.eclipse.jetty.client.HttpSender.send(HttpSender.java:191)
    at org.eclipse.jetty.client.http.HttpChannelOverHTTP.send(HttpChannelOverHTTP.java:52)
    at org.eclipse.jetty.client.http.HttpConnectionOverHTTP$Delegate.send(HttpConnectionOverHTTP.java:168)
    at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.send(HttpConnectionOverHTTP.java:69)
    at org.eclipse.jetty.client.http.HttpDestinationOverHTTP.send(HttpDestinationOverHTTP.java:36)
    at org.eclipse.jetty.client.http.HttpDestinationOverHTTP.send(HttpDestinationOverHTTP.java:26)
    at org.eclipse.jetty.client.PoolingHttpDestination$2.run(PoolingHttpDestination.java:130)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.nio.BufferOverflowException
    at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:183)
    at java.nio.ByteBuffer.put(ByteBuffer.java:832)
    at org.eclipse.jetty.http.HttpGenerator.generateRequestLine(HttpGenerator.java:500)
    at org.eclipse.jetty.http.HttpGenerator.generateRequest(HttpGenerator.java:218)
    ... 11 more

选择的答案是完美的,我只是想补充一点,当发送大文件时,最好使用这种方法:

Request request = httpClient.POST("http://0.0.0.0:" + host.getPort() + "/store").content(
            new BytesContentProvider(jsonValue.getBytes()), "text/plain");

否则,如果发送大量jsonValue as a POST param, 你会得到:

414 Request-URI Too Long

使用maven jetty插件版本:9.1.3.v20140225

您将需要“请求缓冲区大小”的自定义值。默认情况下为 4096 字节。

您可以使用 HttpClient 类的 setRequestBufferSize 方法(参见 javadoc:org.eclipse.jetty.client.HttpClient http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/client/HttpClient.html)

HttpClient httpClient = new HttpClient();
httpClient.setRequestBufferSize(/*your custom value*/);
httpClient.start();

ContentResponse response = httpClient.POST("http://0.0.0.0:" + host.getPort() + "/store").param("p", jsonValue).send();

您的自定义值将取决于您发送的字节数以及更多字节数,这些字节始终由 HTTP 客户端实现发送。例如,就我而言,使用上面的代码我发送以下内容:

POST /?p=YOUR_JSON_VALUE HTTP/1.1
Accept-Encoding: gzip
Host: 0.0.0.0:8080/store
User-Agent: Jetty/9.1.3.v20140225
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

响应标头太大 - Jetty 嵌入式版本 9 的相关文章

随机推荐