Реализация оболочки сервлетного ответа приводит к пустому ответу - PullRequest
2 голосов
/ 01 марта 2012

Я попытался реализовать упаковщик ответа сервлета, чтобы изменить ответ.Моя цель - добавить пару тегов в html

. Этот код работает нормально, и теги правильно добавляются в html.Но проблема в том, что в браузерах не IE7 все работает ожидаемо.IE9 / Firefox не имеет никаких проблем вообще.Даже IE7 с других компьютеров не имеет проблем.Только мой браузер IE7 имеет эту проблему, он просто отображает пустую страницу - полный белый экран.Даже при щелчке правой кнопкой мыши по источнику отображается html с пустой головой / телом.

Через Fiddler я вижу, что код ответа равен 200, но длина содержимого равна 0.

Если я выполняю F5 одновременно, Fidder показываетэта ошибка

Fiddler обнаружил нарушение протокола в сеансе № 3.

Сервер не возвратил правильно отформатированные заголовки HTTP.Заголовки HTTP должны заканчиваться символом CRLFCRLF.Они были завершены с LFLF.

Я не манипулирую никакими атрибутами заголовка.Хотя он работает везде, кроме моего браузера, я хочу знать, в чем проблема, поскольку мы не можем предсказать, какие браузеры там, как у меня.

Вот мой код.

    HttpServletRequest httpServletRequest   = (HttpServletRequest)request;
    HttpServletResponse httpServletResponse = (HttpServletResponse)response;
    BrowserRequestWrapper requestWrapper    = new BrowserRequestWrapper(httpServletRequest);
    BrowserResponseWrapper responseWrapper  = new BrowserResponseWrapper(httpServletResponse);
    PrintWriter responsePrintWriter         = response.getWriter();
    filterChain.doFilter(requestWrapper,responseWrapper);
    try {           
        String responseString       = responseWrapper.toString();           
        String processedResponse    = getProcessedResponse(responseString);         
        response.setContentLength( processedResponse.length() );

        responsePrintWriter.write(processedResponse);
        //responsePrintWriter.flush();
        responsePrintWriter.close();
    } catch (Throwable t) {
        Logger.getLocation().errorT("doFilter","An exception has occured");
        Logger.getStackTrace(t);
    }   

Вот класс оболочки.

public class BrowserResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;

public String toString() {
    return output.toString();
}
public BrowserResponseWrapper(HttpServletResponse response){
    super(response);
    output = new CharArrayWriter();
}

public PrintWriter getWriter(){     
    return new PrintWriter(output);
}
}
...