2014-11-04 10 views
7

在web.xml中,我對全局錯誤頁面具有以下配置。正在處理的頁面在錯誤/異常中僅留下一半空白,而不是轉發到web.xml中指定的錯誤頁面

<error-page> 
    <error-code>401</error-code> 
    <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
</error-page> 

<error-page> 
    <error-code>403</error-code> 
    <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
</error-page> 

<error-page> 
    <error-code>404</error-code> 
    <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
</error-page> 

<error-page> 
    <error-code>500</error-code> 
    <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
</error-page> 

<error-page> 
    <error-code>503</error-code> 
    <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
</error-page> 

當任何出現異常時(在500內部服務器錯誤結果),該請求被預期要被分派到指定的錯誤頁面,但是在發生異常時,正被處理的頁面只是留空在中途。它不轉發到錯誤頁面。

配置java.lang.Throwablejava.lang.Exception如下,

<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
</error-page> 

也沒了幫助。


web.xml文件的全部內容:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <context-param> 
     <param-name>javax.faces.FACELETS_LIBRARIES</param-name> 
     <param-value>/WEB-INF/my.taglib.xml</param-value> 
    </context-param> 

    <context-param> 
     <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Production</param-value> 
    </context-param> 

    <context-param> 
     <param-name>com.sun.faces.enableViewStateIdRendering</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <context-param> 
     <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
     <param-value>true</param-value> 
    </context-param> 

    <context-param> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>server</param-value> 
    </context-param> 

    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>/WEB-INF/log4j.properties</param-value> 
    </context-param> 

    <context-param> 
     <param-name>log4jExposeWebAppRoot</param-name> 
     <param-value>false</param-value> 
    </context-param> 

    <filter> 
     <filter-name>PrimeFaces FileUpload Filter</filter-name> 
     <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>PrimeFaces FileUpload Filter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 


    <error-page> 
     <error-code>401</error-code> 
     <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
    </error-page> 

    <error-page> 
     <error-code>403</error-code> 
     <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
    </error-page> 

    <error-page> 
     <error-code>404</error-code> 
     <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
    </error-page> 

    <error-page> 
     <error-code>500</error-code> 
     <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
    </error-page> 

    <error-page> 
     <error-code>503</error-code> 
     <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
    </error-page> 

    <error-page> 
     <exception-type>java.lang.Throwable</exception-type> 
     <location>/WEB-INF/error_pages/GeneralError.xhtml</location> 
    </error-page> 

    <security-constraint> 
     <display-name>AdminConstraint</display-name> 
     <web-resource-collection> 
      <web-resource-name>ROLE_ADMIN</web-resource-name> 
      <description/> 
      <url-pattern>/admin_side/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>ROLE_ADMIN</role-name> 
     </auth-constraint> 
     <user-data-constraint> 
      <description/> 
      <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 

    <security-constraint> 
     <display-name>UserConstraint</display-name> 
     <web-resource-collection> 
      <web-resource-name>ROLE_USER</web-resource-name> 
      <description/> 
      <url-pattern>/user_side/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>ROLE_USER</role-name> 
     </auth-constraint> 
     <user-data-constraint> 
      <description/> 
      <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 


    <login-config> 
     <auth-method>FORM</auth-method> 
     <realm-name>projectRealm</realm-name> 
     <form-login-config> 
      <form-login-page>/utility/Login.xhtml</form-login-page> 
      <form-error-page>/utility/ErrorPage.xhtml</form-error-page> 
     </form-login-config> 
    </login-config> 
    <security-role> 
     <description/> 
     <role-name>ROLE_ADMIN</role-name> 
    </security-role> 
    <security-role> 
     <description/> 
     <role-name>ROLE_USER</role-name> 
    </security-role> 
    <!--error-page> 
     <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
     <location>/utility/Login.xhtml</location> 
    </error-page--> 

    <session-config> 
     <session-timeout> 
      120 
     </session-timeout> 
     <tracking-mode>COOKIE</tracking-mode> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>utility/Login.xhtml</welcome-file> 
    </welcome-file-list> 
</web-app> 

也試過在一個空白的項目只有一個單一的XHTML頁面並沒有什麼比在web.xml錯誤頁面的配置等。當發生異常(其他HTTP狀態,只有404作品)時,頁面只是半透半邊,而不是轉發到錯誤頁面。

如何在發生任何異常/錯誤時分派到指定的錯誤頁面?


更新1:

根據this問題/答案,我添加上下文參數javax.faces.FACELETS_BUFFER_SIZE到web.xml中有64KB的緩衝區大小,但沒有新發生。如果發生異常,它仍然不會轉發到錯誤頁面。如果發生異常/錯誤,頁面只會被部分處理並在中途留空。異常堆棧跟蹤只能在服務器終端上找到,而不能在網頁上找到(如果500內部服務器錯誤)。如果它轉發到錯誤頁面,我故意讓應用程序拋出異常來查看。


更新2:

在編輯1中提到設置的緩衝區大小後,我得到了以下例外在某一時間(當在成功登錄後一請求被重定向到安全區域)。所以,我現在刪除了這個參數。

Severe: Error Rendering View[/utility/Login.xhtml] 
java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.setBufferSize(ResponseFacade.java:285) 
    at com.sun.faces.context.ExternalContextImpl.setResponseBufferSize(ExternalContextImpl.java:923) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:1162) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:403) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:72) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at filter.LoginNocacheFilter.doFilter(LoginNocacheFilter.java:39) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
    at java.lang.Thread.run(Thread.java:745) 

Info: Exception when handling error trying to reset the response. 
java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.setBufferSize(ResponseFacade.java:285) 
    at com.sun.faces.context.ExternalContextImpl.setResponseBufferSize(ExternalContextImpl.java:923) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:1162) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:403) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:72) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at filter.LoginNocacheFilter.doFilter(LoginNocacheFilter.java:39) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
    at java.lang.Thread.run(Thread.java:745) 

更新3:

我試圖增加緩衝區的大小(100002400那是太多了),直到錯誤java.lang.OutOfMemoryError: Java heap space發出。因此,輸出緩衝區大小不應該成爲問題。

通過OmniFaces - org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactoryfaces-config.xml中配置,可以在異步請求期間錯誤地正確呈現Ajaxical事件中的錯誤頁面。

也許,如果我在開始時配置了錯誤頁面,那麼可能會發現問題的原因 - 當我啓動應用程序時,應用程序因此沒有太多的額外開銷,它與許多XHTML頁面,CDI託管的bean,EJB會話bean等,但無論如何,我不知所措。


更新4:

我現在運行在WildFly 9.0.2最終相同的應用程序。問題沒有改變。

+0

您是否在完全不同的容器中嘗試了這種方法?也許JBoss? – kolossus 2014-12-02 15:49:24

+0

它僅是GlassFish Server 4.1,它是部署到服務器的唯一應用程序。其他服務器在GlassFish運行時關閉。 @kolossus – Tiny 2014-12-02 16:12:33

+0

我的要點是,你應該嘗試消除你的容器中的錯誤的可能性;嘗試將相同的應用程序部署到不同的容器 – kolossus 2014-12-02 16:17:19

回答

-1

通過增加錯誤頁面的大小來檢查GeneralError.xhtml。 有時,如果服務器的大小較小,則不顯示錯誤頁面。 即嘗試向GeneralError.xhtml添加更多50-100行文本並檢查)

+0

這不是服務器特定的。這是瀏覽器特定的。特別是由雷德蒙德某個團隊開發的。無論如何,有更好的方法來顯示錯誤頁面。此外,這不是OP的具體問題的原因,因爲所討論的瀏覽器並不顯示完全空白的頁面。 – BalusC 2015-06-08 04:51:33

+0

當服務器不顯示正確的頁面時,瀏覽器將選擇顯示它所具有的默認錯誤頁面。 – Nitin 2015-06-08 04:55:25

+0

如上所述,這不是問題。再次閱讀問題。如果你實際上不了解任何東西,你爲什麼回答它? – BalusC 2015-06-08 08:20:16

相關問題