Wie kann ich verhindern das "Broken pipe" von der Aufnahme bis meine tomcat-web-site?

Ich habe einen Tomcat-8 web-Anwendung, die eine 2-MB-png-Bild als ein "splash/Landung Seite" hintergrund. Das Bild wird in einem externen stylesheet.

Wenn lösche ich meinen browser-cache, direkt-request der URL von dem Bild, aber navigieren Weg von dem Bild, bevor es geladen wurde, es wird völlig zu töten meine web-Anwendung. Er nicht mehr Antworten für alle Anforderungen.

Bekomme ich diesen Fehler:

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:396)
        at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:344)
        at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:421)
        at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:409)
        at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:97)
        at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1795)
        at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:919)
        at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:400)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at other.JsCssImgResponseHeaderFilter.doFilter(JsCssImgResponseHeaderFilter.java:36)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at other.CatchAnyExceptionFilter.doFilter(CatchAnyExceptionFilter.java:39)

Ich versuche die zu fangen, die Ausnahme (oder eine Ausnahme für diese Angelegenheit) und zeigen eine freundliche ErrorPage.jsp, aber ich kann nicht umleiten auf die ErrorPage, da die Reaktion bereits übermittelt wurde.

Ich bin nicht duplizieren, dies in einer Testumgebung, aber ich kann es brechen, wird in der Produktion.

Weiß jemand, was meine Optionen sind für die Lösung dieser Art von problem? Vielen Dank im Voraus.

BTW, hier ist, was mein Filter Klasse doFilter-Methode sieht wie folgt aus:

    public void doFilter(ServletRequest req,
                     ServletResponse res,
                     FilterChain fc) throws IOException, ServletException
{
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession();

    try
    {
        fc.doFilter(req, res);

        //Have learned that response headers should not be set until we have determined there won't be an exception.
        //Can't easily redirect or forward (to an error page, for example) if headers have already been committed.

        if (SessionHelper.hasNeedsJsCssImgResponseHeaderFlag(request))
        {
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.SECOND, JsCssImgResponseHeaderFilter.SECONDS_TO_CACHE);
            response.setHeader("Cache-Control", "PUBLIC, max-age=" + JsCssImgResponseHeaderFilter.SECONDS_TO_CACHE + ", must-revalidate");
            response.setHeader("Expires", DateUtils.getDateInExpiresHeaderFormat(cal.getTime()));
        }
        else if (SessionHelper.hasNeedsDynamicPageResponseHeaderFlag(request))
        {
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Expires", "Mon, 25 Nov 2013 00:00:01 GMT");   //in the past
        }
        else if (SessionHelper.hasNeedsRestServicesResponseHeaderFlag(request))
        {
            //CORS - Cross Origin Resource Sharing: allow service requests from other domains -- 
            //such as local development domains hosting AngularJS projects.

            response.setHeader("Access-Control-Allow-Origin", "http://localhost.domain.com:8080");

            response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE");
            //response.setHeader("Access-Control-Allow-Methods", "*");

            response.setHeader("Access-Control-Allow-Headers", "Content-Type, X-Requested-With");
        }
    }
    catch (Exception e)
    {
        SessionHelper.setErrorPageException(req, session, e);
        final String uri = request.getRequestURI();
        final String playerName = SessionHelper.getLoggedInPlayerName(session);

        String outerLogEntryText = "Player = " + playerName + " - IP = " + request.getRemoteAddr() + 
                " - Mobile = " + SessionHelper.isMobileBrowser(request) +
                " - URI = " + uri + " - Exception MSG = " + e.getMessage();

        LogUtils.writeLogEntry(outerLogEntryText, true, e);
        SessionHelper.setRedirectPage(session, SessionHelper.ERROR_PAGE_PATH);
    }
    finally
    {
        String redirectPage = SessionHelper.getRedirectPage(session);
        SessionHelper.clearRedirectPage(session);

        if (redirectPage != null)
        {
            if (response.isCommitted())
            {
                //Article: http://stackoverflow.com/questions/11305563/cause-of-servlets-response-already-committed
                System.out.println("Response has been committed.  Cannot redirect to: " + redirectPage);
            }
            else
            {
                response.sendRedirect(redirectPage);
            }
        }
    }
}

Wenn das problem Auftritt, meine "Antwort hat, begangen wurden..." output-Anweisung wird ja auch geschrieben, es ist also nicht umleiten auf meiner Fehler-Seite. Das ist meine Herausforderung: zum umleiten von irgendwo, wenn dies nicht geschieht-oder eine bessere/harmlosen Aktion.

spielt es eine Rolle, welchen browser Sie verwenden? Chrome Firefox v. v. v. IE Safari?
was genau meinst du mit wechseln? schließen Sie die Seite? schalten Sie eine Registerkarte? gehen Sie zu einer anderen Seite auf der gleichen Website? eine Pfeife bedeutet, dass die Verbindung zwischen dem server und den client getrennt wurde, bevor die Seite fertig geladen ist. btw, 2mb Bild auf einer Website ist zu wenig, auch wenn es die einzige Sache, die es gibt.
Diese Ausnahme wurde erwischt. das heißt, es hat sich nicht selbst getötet, der thread wurde geworfen, geschweige denn die gesamte Tomcat. Ich schlage vor, dass problem liegt woanders.
Khuderm, indem Sie Weg zu navigieren, ich meine, klicken Sie auf einen link, der geht woanders -- wie ein link auf die browser-Lesezeichen-Bar, geht zu einem anderen Standort. Da die original-Beitrag, den ich verwendet tinypng.com zu reduzieren, meine splash-hintergrund-Bilder mit einer Größe von 539 KB.
EJP, ja, die Ausnahme abgefangen ist. Technisch ist es wohl noch nicht getötet Tomcat, aber meine web-app reagiert nicht mehr auf Anfragen, und die Tomcat-Manager-app nicht mehr funktioniert. Ich starten Sie den Tomcat-Dienst zu erholen.

InformationsquelleAutor Steve Swett | 2016-03-03

Schreibe einen Kommentar