Spring MVC:如何修改从Spring控制器发送的响应?


问题内容

我有一个使用Spring MVC 3.1.3的应用程序,以及使用Dojo
1.4开发的UI。该应用程序有几个控制器可以处理通过上载的二进制文件dojo.io.iframe.send。控制器发送一个json响应,该响应必须包含

<html><body><textarea>{my json response}</textarea></body></html>.

我已经实现了在web.xml中定义的自定义过滤器:

<filter>
    <filter-name>dojoIframeFilter</filter-name>
    <filter-class>com.app.web.MultipartAjaxFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>dojoIframeFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

过滤器的doFilter具有此行为,该行为取自http://www.oracle.com/technetwork/java/filters-137243.html

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    if (request.getContentType() != null
            && request.getContentType().contains("multipart/form-data")) {
        CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, wrapper);
        log.info(wrapper.toString());
        //Modify response here
    } 
    else {
        chain.doFilter(request, response);
    }
}

包装器的输出为空。我还尝试了许多其他组合,例如为spring的调度程序servlet放置自定义过滤器,取消了doFilter内的if块,这些都不起作用。我还尝试编写Spring拦截器,但也失败了。有人可以提出其他想法吗?

提前致谢。

更新: 我禁用了spring安全性,并使用普通spring mvc进行了测试,但是问题仍然存在。我修改了标题和问题描述。


问题答案:

朋友,除了成功修改ServletResponse之外,我们还需要子类ServletOutputStream。请参阅http://docstore.mik.ua/orelly/xml/jxslt/ch08_04.htm了解详细解决方案。