2011-04-20 41 views
1

我意識到有很多與此主題相關的問題,但都與寫入響應然後執行重定向/轉發或類似的事情有關以可預測和容易重現的方式。隨機java.lang.IllegalStateException:響應已提交後無法轉發

我遇到的問題是有一天,生產應用程序突然開始在隨機頁面上提出這個異常,每天4次,每次5次。堆棧跟蹤如下。 該應用程序使用myfaces 1.1.9,richfaces 3.1.4.GA,tomahawk 1.1.10並部署在tomcat 5.5.33上。 我試過更新這個庫,但問題仍然存在。

顯然當請求進來時,響應已經被提交。我不知道爲什麼會發生這種情況。讀取tomcat源代碼時,唯一可行的方法是如果未調用Response的recycle()方法。但每次調試應用程序時,都會調用該方法。 無論請求是否是ajax,情況都是如此。

我不能重現這個錯誤,所以任何幫助,可以不勝感激。

堆棧跟蹤的HTTP請求:

 
19 Apr 2011 11:27:44,817 ERROR [http-8080-Processor44] (ExceptionFilter.java:42) - java.lang.IllegalStateException: Cannot forward after response has been committed 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:323) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311) 
    at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:426) 
    at org.apache.myfaces.tomahawk.application.jsp.JspTilesViewHandlerImpl.dispatch(JspTilesViewHandlerImpl.java:236) 
    at org.apache.myfaces.tomahawk.application.jsp.JspTilesViewHandlerImpl.renderView(JspTilesViewHandlerImpl.java:222) 
    at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108) 
    at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216) 
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:146) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:147) 
    at utils.CustomFacesServlet.service(CustomFacesServlet.java:42) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141) 
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at presentacion.filters.AutorizacionFilter.doFilter(AutorizacionFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at presentacion.filters.LoggingFilter.doFilter(LoggingFilter.java:32) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at presentacion.filters.ExceptionFilter.doFilter(ExceptionFilter.java:28) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:392) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:500) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:636) 

19 Apr 2011 11:27:44,818 ERROR [http-8080-Processor44] (StandardWrapperValve.java:260) - Servlet.service() for servlet Faces Servlet threw exception 
java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:433) 
    at presentacion.filters.ExceptionFilter.doFilter(ExceptionFilter.java:44) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:392) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:500) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:636) 

 

堆棧跟蹤的Ajax請求:

 
13 Apr 2011 07:12:24,841 ERROR [http-8080-Processor48] (CustomFacesServlet.java:63) - java.lang.IllegalStateException: Cannot forward after response has been committed 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:323) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311) 
    at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:425) 
    at org.apache.myfaces.tomahawk.application.jsp.JspTilesViewHandlerImpl.dispatch(JspTilesViewHandlerImpl.java:236) 
    at org.apache.myfaces.tomahawk.application.jsp.JspTilesViewHandlerImpl.renderView(JspTilesViewHandlerImpl.java:222) 
    at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108) 
    at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216) 
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:146) 
    at org.apache.myfaces.custom.ppr.PPRLifecycleWrapper.render(PPRLifecycleWrapper.java:84) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:147) 
    at utils.CustomFacesServlet.service(CustomFacesServlet.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141) 
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at presentacion.filters.AutorizacionFilter.doFilter(AutorizacionFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at presentacion.filters.LoggingFilter.doFilter(LoggingFilter.java:34) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:344) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:500) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:636) 

13 Apr 2011 07:12:24,842 ERROR [http-8080-Processor48] (StandardWrapperValve.java:260) - Servlet.service() for servlet Faces Servlet threw exception 
java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:308) 
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:168) 
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at presentacion.filters.AutorizacionFilter.doFilter(AutorizacionFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at presentacion.filters.LoggingFilter.doFilter(LoggingFilter.java:34) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:344) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:500) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:636) 
 
+0

錯誤發生在CustomFacesServlet utilsCustomFacesServlet.service(CustomFacesServlet.java:52)'的第52行。檢查你在第52行的內容。另外,在'AutorizacionFilter#doFilter'方法的第51行檢查你的代碼 - 看起來也有問題! – ChuongPham 2011-04-20 03:49:00

+0

@Chuong:CustomFacesServlet只將請求包裝在Hibernate Session中,不會觸及響應。AutorizacionFilter是一個Servlet過濾器,它在應用程序中處理授權,如果用戶未經授權但不寫入響應,它會執行重定向。除了發生錯誤時,用戶被授權(無重定向)。 – Max 2011-04-20 15:50:25

+0

沒有看到您的Servlet或過濾器的代碼,我猜你正在嘗試執行'HttpServletResponse.sendRedirect'而不是'FacesContext.getCurrentInstance()。getExternalContext()。redirect(url)'。另外,在你的IDE中打開你的調試,併發布上述錯誤發生的代碼。這將有助於回答您的問題 – ChuongPham 2011-04-22 15:14:36

回答

0

如果你寫更多的響應輸出比它緩衝區可能發生這種情況。填充響應緩衝區後,字節開始流式傳輸到客戶端。此時,您不能將響應更改爲重定向,因爲HTTP響應標頭已經發送到客戶端。以下是我可以想到的一些選項,您必須解決這個問題:

  1. 檢測到您需要在請求處理中更快地重定向。
  2. 配置處理此請求的servlet或過濾器,使其具有較大的響應緩衝區。
  3. 編寫一個過濾器來緩衝更多的輸出(也許這裏已經有一個庫)。

我會說,理想情況下,你做#1,但是我知道這可能會有時棘手。如果偶爾存在,選項#2很難找到正確的配置選項。最後一個選項是一個全面的修復,但請注意,您還需要延遲第一個字節到客戶端。這應該是相當簡單的寫作,我想已經有代碼可以做到這一點(不能認爲任何包含它的東西雖然)。

+0

感謝您的快速響應。問題是我沒有做任何重定向。在簡單的JSF請求隨機頁面引發異常(POST和然後轉發)。除了日誌之外,我可以告訴用戶在錯誤發生後嘗試再次訪問同一頁面,它工作得很好。這就是爲什麼我不能重現這個問題。 – Max 2011-04-20 15:34:22

1

我面臨同樣的問題,在我的情況下是http連接器。它變得徹底,但沒有錯誤,只是java.lang.IllegalStateException

解決方案:修改server.xml$JBOSS_HOME/server/<environment>/deploy/jbossweb.sar/並添加acceptCount="1000"maxThreads="500"(這在我的情況)。
希望有所幫助。

相關問題