Servlet过滤器包装器 - 更改内容类型时遇到问题 [英] Servlet filter wrapper - trouble changing content type

查看:79
本文介绍了Servlet过滤器包装器 - 更改内容类型时遇到问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have RESTful web service which is consumed by javascript. This service returns a content type of "application/json". However, for IE the content type must be "text/html". So I written a filter and wrapper to change the content type when IE is detected as the client. My logic seems to have no effect on the content type. What am I doing wrong?

过滤器:

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服务使用我的包装器设置内容类型:

I found an answer. The trick was to prevent my web service from setting the content-type using my wrapper:

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(); 
     } 
}

我的过滤器现在看起来像:

And my filter now looks like:

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

}

我不确定这是否是打算使用包装但是它有效。

I'm not sure if this was how wrappers were intended to be used but heck it works.

这篇关于Servlet过滤器包装器 - 更改内容类型时遇到问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆