Servletfilter包装器 – 更改内容类型时遇到问题

我有RESTful网络服务,由javascript使用。 此服务返回内容类型“application / json”。 但是,对于IE,内容类型必须是“text / html”。 因此,当IE被检测为客户端时,我编写了一个filter和包装器来更改内容类型。 我的逻辑似乎对内容类型没有影响。 我究竟做错了什么?

filter:

public class IE8Filter implements Filter { private Logger logger = LoggerHelper.getLogger(); @Override public void destroy() {} @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String userAgent = request.getHeader("User-Agent"); logger.debugf("User Agent = '%s'", userAgent); IE8FilterResponseWrapper wrapper = new IE8FilterResponseWrapper(response); chain.doFilter(req, wrapper); if (userAgent.contains("MSIE 8") || userAgent.contains("MSIE 7")) { wrapper.setContentType("text/html"); logger.debugf("Content Type = '%s'", wrapper.getContentType()); } } @Override public void init(FilterConfig arg0) throws ServletException {} } 

包装:

 public class IE8FilterResponseWrapper extends HttpServletResponseWrapper { private String contentType; public IE8FilterResponseWrapper(HttpServletResponse response) { super(response); } public void setContentType(String type) { this.contentType = type; super.setContentType(type); } public String getContentType() { return contentType; } } 

我找到了答案。 诀窍是阻止我的Web服务使用我的包装器设置内容类型:

 public class IE8FilterResponseWrapper extends HttpServletResponseWrapper { public IE8FilterResponseWrapper(HttpServletResponse response) { super(response); } public void forceContentType(String type) { super.setContentType(type); } public void setContentType(String type) { } public void setHeader(String name, String value) { if (!name.equals("Content-Type")) { super.setHeader(name, value); } } public void addHeader(String name, String value) { if (!name.equals("Content-Type")) { super.addHeader(name, value); } } public String getContentType() { return super.getContentType(); } } 

我的filter现在看起来像:

 public class IE8Filter implements Filter { private Logger logger = LoggerHelper.getLogger(); @Override public void destroy() {} @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String userAgent = request.getHeader("User-Agent"); logger.debugf("User Agent = '%s'", userAgent); IE8FilterResponseWrapper wrapper = new IE8FilterResponseWrapper(response); if (userAgent.contains("MSIE 8") || userAgent.contains("MSIE 7")) { wrapper.forceContentType("text/html"); chain.doFilter(req, wrapper); } else { chain.doFilter(req, res); } } @Override public void init(FilterConfig arg0) throws ServletException {} } 

我不确定这是不是打算如何使用包装,但它确实有效。