回到顶部
您的当前位置: 编程语言> JAVA> 开发工具> Jetty
jetty提交数据时报错,Form too large...
2014-07-24 21:57:38
标签: 转载 jetty 提交 数据 IllegalStateException Form too large
问题描述

今天在使用Eclipse的Jetty插件做为服务器提交富文本编辑中的数据时,报如下异常:

java.lang.IllegalStateException: Form too large270468>200000
	at org.mortbay.jetty.Request.extractParameters(Request.java:1561)
	at org.mortbay.jetty.Request.getParameterMap(Request.java:870)
	at org.apache.struts2.dispatcher.Dispatcher.createContextMap(Dispatcher.java:528)
	at org.apache.struts2.dispatcher.ng.PrepareOperations.createActionContext(PrepareOperations.java:78)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter.doFilter(StrutsPrepareFilter.java:74)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
问题原因

很明显是单个请求数据过大,Form too large>200000(200000即200000Byte约为2M),但异常是在什么地方抛出来的呢,经过一番研究,发现是Jetty插件报出的如下:  在\eclipse\plugins目录下,找到org.mortbay.jetty.server_6.1.23.v201012071420.jar包,扔进JD-GUI中,根据报错提示信息org.morbay.jetty.Request.extractParameters()方法中找到如下信息:

注意观察箭头所示部分,异常应该是这儿抛出来的,但maxFormContentSize值是从那里来的呢,依据this._context.getContextHandler().getMaxFormContentSize()这句提示,找到org.mortbay.jetty.handlerContextHandler.class类,结果发现该类中有如下一句,兴奋,默认值在此。

那么这个默认值是设置好的,所以为报错。

解决方案

如何修改呢,通过看Request类里的this._context.getContextHandler().getMaxFormContentSize()代码,继续追踪,该值应该是从WEB的入口获取的即web.xml,但是这个值如何传进去呢,经过网上的搜索与实践,可以在WEB-INF目录下新建一个jetty-web.xml文件,里面写如下内容,对maxFormContentSize重新赋值即可(Jetty6适用)

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
"http://jetty.mortbay.org/configure.dtd">
<Configure id="WebAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
    <Set name="maxFormContentSize" type="int">600000</Set>
</Configure>

若大小还是不够的话,可以增加maxFormContentSize的值。