Servlet响应包装器实现导致空响应

时间:2012-03-01 04:43:11

标签: servlets request response wrapper

我尝试实现servlet响应包装器来修改响应。 我的目标是在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);
}
}

0 个答案:

没有答案