【发布时间】:2017-04-28 15:30:39
【问题描述】:
我在 karaf Jetty 上运行 REST API,REST 服务使用 JWT 令牌来保证安全。向服务发送请求时,服务器抱怨标头太大。抛出以下异常(Header is too large >8192)。
2017-04-28 10:38:35,461 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | URI --> SPACE2
2017-04-28 10:38:35,461 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | SPACE2 --> REQUEST_VERSION
2017-04-28 10:38:35,461 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | REQUEST_VERSION --> HEADER
2017-04-28 10:38:35,461 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | HEADER --> HEADER_VALUE
2017-04-28 10:38:35,461 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | HEADER_VALUE --> HEADER_IN_VALUE
2017-04-28 10:38:35,464 | DEBUG | tp1430443284-800 | ChannelEndPoint | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | filled 1887 SelectChannelEndPoint@269ccd27{/10.30.8.29:14179<->8181,Open,in,out,-,-,4/30000,HttpConnection}{io=0,kio=0,kro=1}
2017-04-28 10:38:35,464 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | parseNext s=HEADER_IN_VALUE HeapByteBuffer@77e9f1ca[p=0,l=1887,c=8192,r=1887]={<<<NSVhfTU5HUl9HRVRf...0.8.29:8181\r\n\r\n>>>JPTEVfVk1XQVJFX01...T0xFX1NFUlZJQ0V}
2017-04-28 10:38:35,464 | WARN | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | Header is too large >8192
2017-04-28 10:38:35,465 | WARN | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | badMessage: 413 for HttpChannelOverHttp@548aa950{r=0,c=false,a=IDLE,uri=-}
2017-04-28 10:38:35,465 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 |
org.eclipse.jetty.http.HttpParser$BadMessageException
at org.eclipse.jetty.http.HttpParser.parseHeaders(HttpParser.java:932)[97:org.eclipse.jetty.http:9.2.10.v20150310]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1256)[97:org.eclipse.jetty.http:9.2.10.v20150310]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:250)[106:org.eclipse.jetty.server:9.2.10.v20150310]
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)[98:org.eclipse.jetty.io:9.2.10.v20150310]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)[109:org.eclipse.jetty.util:9.2.10.v20150310]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)[109:org.eclipse.jetty.util:9.2.10.v20150310]
at java.lang.Thread.run(Thread.java:745)[:1.8.0_101]
2017-04-28 10:38:35,465 | DEBUG | tp1430443284-800 | HttpParser | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | HEADER_IN_VALUE --> CLOSED
2017-04-28 10:38:35,465 | DEBUG | tp1430443284-800 | HttpChannelState | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | HttpChannelState@462fabb8{s=IDLE i=true a=null} handling IDLE
2017-04-28 10:38:35,465 | DEBUG | tp1430443284-800 | HttpConnection | 109 - org.eclipse.jetty.util - 9.2.10.v20150310 | org.eclipse.jetty.server.HttpConnect
我尝试使用 jetty.xml 上的以下配置来增加 JETTY 的标头大小属性。然而,码头一直抱怨标题大小(标题太大> 8192),更改后有同样的异常。出于某种原因,JETTY 没有使用此配置增加标头大小,有人可以说明如何解决此问题吗?谢谢
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<Set name="host">
<Property name="jetty.host" />
</Set>
<Set name="port">
<Property name="jetty.port" default="8181" />
</Set>
<Set name="maxIdleTime">300000</Set>
<Set name="Acceptors">2</Set>
<Set name="statsOn">false</Set>
<Set name="confidentialPort">8443</Set>
<Set name="lowResourcesConnections">20000</Set>
<Set name="lowResourcesMaxIdleTime">5000</Set>
<Set name="requestHeaderSize">32768</Set>
<Set name="headerCacheSize">32768</Set>
</New>
</Arg>
</Call>
经过一番研究,我发现一篇文章指出了 jetty.xml 上的以下配置更改,这是使用 SSL 但是码头中的标头大小仍然没有改变,我得到了同样的错误。
<New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
<Set name="secureScheme">https</Set>
<Set name="securePort">
<Property name="jetty.secure.port" default="8443" />
</Set>
<Set name="outputBufferSize">32768</Set>
<Set name="requestHeaderSize">32768</Set>
<Set name="responseHeaderSize">32768</Set>
<Set name="sendServerVersion">true</Set>
<Set name="sendDateHeader">false</Set>
<Set name="headerCacheSize">512</Set>
</New>
【问题讨论】:
-
Jetty 9.2.10.v20150310 没有
org.eclipse.jetty.server.nio.SelectChannelConnector。该配置应该使您的启动完全失败。没有使用你的配置,也许 karaf 有不同的方式来配置自己? -
在增加该限制时要小心,因为许多 HTTP 中介(代理、网关、负载平衡器、第 7 层路由器)在 HTTP 标头较大时无法正常工作。
-
感谢您的建议,我会考虑的。
标签: rest jetty embedded-jetty apache-karaf