您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Servlet过滤器包装器-更改内容类型时遇到麻烦

Servlet过滤器包装器-更改内容类型时遇到麻烦

我找到了答案。诀窍是防止我的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(); 
     } 
}

现在我的过滤器如下所示:

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 {}

}

我不确定这是否是打算使用包装器的方式,但确实可行。

Jave 2022/1/1 18:26:26 有588人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶