2013-01-08 8 views
5

Używam elementu iframe do wyświetlania pliku pdf, z możliwością dla użytkownika zapisać go, wydrukować go, itd. Ale gdy użytkownik nawiguje do tyłu lub w innym miejscu tej ist błędzie zawsze rzucone:Element iframe powoduje wyjątek ClientAbortException: java.io.IOException na org.apache.catalina.connector.OutputBuffer.realWriteBytes (OutputBuffer.java:369)

ClientAbortException: java.io.IOException 
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:369) 
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:448) 
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:363) 
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392) 
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381) 
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89) 
    at java.nio.channels.Channels$WritableByteChannelImpl.write(Channels.java:296) 
    at com.sun.faces.application.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:277) 
    at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:119) 
    at org.primefaces.application.PrimeResourceHandler.handleResourceRequest(PrimeResourceHandler.java:91) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:310) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675) 
    at java.lang.Thread.run(Thread.java:662) 

Co mogę zrobić?

Odpowiedz

7

ClientAbortException

Generalnie, można po prostu zignorować. Ten wyjątek zostanie zgłoszony, gdy klient nagle przerwie żądanie HTTP podczas ładowania strony. Nastąpi to, gdy klient nacisnął Esc, lub pospiesznie opuścił przeglądarkę lub zamknął przeglądarkę, albo dostał się do sieci, a nawet zapalił się. Wszystko to jest całkowicie poza kontrolą.

Stacktrace wskazuje, że jest żądaniem zasobu JSF obsługiwanym przez <h:outputStylesheet>, <h:outputScript> i <h:graphicImage> (oraz odpowiednikami PrimeFaces). Tak się działo, podczas gdy przeglądarka próbuje pobrać CSS, JS i/lub zasoby obrazu.

Cóż, musisz po prostu "żyć z tym". Jeśli zastanawiasz się nad "hałasem" w dziennikach serwera, możesz rozważyć utworzenie servlet filter, które pomija te wyjątki.

try { 
    chain.doFilter(request, response); 
} catch (ClientAbortException e) { 
    // Log a single line instead of whole stacktrace, or just ignore it. 
} 

Należy pamiętać, że jest to klasa wyjątek servletcontainer specyficzne (od Catalina/Tomcat), a więc taki filtr jest w ten sposób mocno połączona z make specyficzny servletcontainer (to nie jest przenośny do GlassFish lub inne). Ponieważ jest to podklasa IOException, możesz chcieć ją przechwycić i wykonać test Class#getSimpleName().

Powiązane problemy