Jetty7.6 java.lang.IllegalStateException: Form too large 563410>200000或Form too many keys異常

Jetty7.6 java.lang.IllegalStateException: Form too large 563410>200000或Form too many keys異常

(2015-05-30 14:53:27)
標籤:

jetty

分類:Web

在做一個用Jetty作爲服務器的Web項目時,Form提交數據太大的話報以下兩個錯誤,百度了一下原來是Jetty報出的異常:

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

 

2、java.lang.IllegalStateException: Form too many keys
 atorg.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:518)
 atorg.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:611)
 atorg.eclipse.jetty.server.Request.extractParameters(Request.java:298)
 atorg.eclipse.jetty.server.Request.getParameterMap(Request.java:719)
 atorg.apache.struts2.dispatcher.Dispatcher.createContextMap(Dispatcher.java:592)
 atorg.apache.struts2.dispatcher.ng.PrepareOperations.createActionContext(PrepareOperations.java:78)
 atorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:78)
 atorg.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)
 atcom.zhongpin.pap.filter.AuthorityFilter.doFilter(AuthorityFilter.java:77)
 atorg.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)
 atorg.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:233)
 atorg.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 atorg.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)
 atorg.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)
 atorg.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
 atorg.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:532)
 atorg.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
 atorg.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
 atorg.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
 atorg.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
 atorg.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
 atorg.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
 atorg.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
 atorg.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
 atorg.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
 atorg.eclipse.jetty.server.Server.handle(Server.java:369)
 atorg.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)
 atorg.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:944)
 atorg.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1005)
 atorg.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
 atorg.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
 atorg.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
 atorg.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
 atorg.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
 atorg.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
 atorg.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
 at java.lang.Thread.run(Thread.java:619)

看了Jetty的源碼才發現,jetty限制了Form提交數據的大小,該源碼類來自jettylib庫下的jetty-server-7.6.16.v20140903.jar包下的

org.eclipse.jetty.server.Request類,打開該類可以看到以下代碼:

Jetty7.6 <wbr>java.lang.IllegalStateException: <wbr>Form <wbr>too <wbr>large <wbr>563410>200000或Form <wbr>too <wbr>many <wbr>keys異常
Jetty7.6 <wbr>java.lang.IllegalStateException: <wbr>Form <wbr>too <wbr>large <wbr>563410>200000或Form <wbr>too <wbr>many <wbr>keys異常

      分析以上代碼可以看出,jetty限制了form提交數據的最大size和最大keys數,通過上面代碼可以看出,jetty默認maxFormContentSize爲200000,maxFormKeys爲1000;而若我們提交的數據超過這兩個值了,就是報上面那兩個Java異常,那怎麼辦呢?難道讓我們去修改他們的源碼嗎?答案isNo。

      Jetty提供瞭解決該問題的兩種方式,任選其一即可:

     一是修改Jetty的jetty.xml文件

            在jetty.xml文件中添加以下配置:

             Jetty7.6 <wbr>java.lang.IllegalStateException: <wbr>Form <wbr>too <wbr>large <wbr>563410>200000或Form <wbr>too <wbr>many <wbr>keys異常

       maxFormContentSize默認是200000,maxFormKeys是1000,我們只需將這兩個值改成我們所需的最大值即可,還有一種值就是把這兩個值都設置爲小於0的任何值,一般爲-1,表示不限制Form提交數據的大小。

     二是在web項目中的WEB-INF文件夾下新建一個jetty-web.xml文件

           在jetty-web.xml 文件中添加以下內容:

 

         Jetty7.6 <wbr>java.lang.IllegalStateException: <wbr>Form <wbr>too <wbr>large <wbr>563410>200000或Form <wbr>too <wbr>many <wbr>keys異常
       和第一種配置一樣將maxFormContentSize和maxFormKeys的值修改成自己想要的值即可。


發佈了13 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章