2016-11-06 36 views
1

我试图使用ServletFilter更改ServletResponse内容类型。但是,servlet(在我的内容中,AxisServlet)在chain.doFilter()调用时更新Content-Type。但其他响应头正确更新。如何使用ServeletFilter完成Servlet处理之后更新响应内容类型

我尝试在调用doFilter后设置响应标头。那时没有更新响应标题。

有没有人知道在Servelt完成后更新ServletResponse的内容类型的方法?

代码:

public class HeaderFilter implements Filter { 

    private HashMap<String,String> rsCustomHeaders = new HashMap<String,String>(); 

    public void init(FilterConfig config) throws ServletException { 

     Enumeration<String> initParameterNames = config.getInitParameterNames(); 

     while (initParameterNames.hasMoreElements()) { 

      String initParameterName = initParameterNames.nextElement(); 

      rsCustomHeaders.put(initParameterName, config.getInitParameter(initParameterName)); 

     } 

     System.out.println("init().rsCustomHeaders : " + rsCustomHeaders); 
    } 

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

     HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
     HttpServletResponse httpServletResponse = (HttpServletResponse) response; 

     for (Map.Entry<String, String> rsCustomHeaderEntry : rsCustomHeaders.entrySet()) { 
      httpServletResponse.addHeader(rsCustomHeaderEntry.getKey(), rsCustomHeaderEntry.getValue()); 
     } 

     System.out.println("doFilter().encoding :Set Response Headers Done"); 

     chain.doFilter(httpServletRequest, httpServletResponse); 

     System.out.println("doFilter().HeaderFilter is Done!!!"); 


    } 

    public void destroy() { 
     System.out.println("destroy(). : Destroy is called!"); 
    } 
} 

web.xml中对原response

<filter> 
    <filter-name>HeaderFilter</filter-name> 
    <filter-class>filters.HeaderFilter</filter-class> 
     <init-param> 
     <param-name>content-type</param-name> 
     <param-value>application/xml; charset=utf-8</param-value> 
     </init-param> 
     <init-param> 
     <param-name>Content_type</param-name> 
     <param-value>text/xml; charset=utf-8</param-value> 
     </init-param> 
     <init-param> 
     <param-name>rq_content-type</param-name> 
     <param-value>text/xml; charset=utf-8</param-value> 
     </init-param> 
     <init-param> 
     <param-name>Header-X</param-name> 
     <param-value>Value-X</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
    <filter-name>HeaderFilter</filter-name> 
    <url-pattern>/services/GradeThreeMath</url-pattern> 
    </filter-mapping> 
+0

难道rsCustomHeaders已初始化后,装载值()? – developer

+0

另外,在启动期间和处理过程中,服务器日志中是否有任何异常? – developer

+0

是的值已正确加载,没有例外。除了内容类型(例如:Header-X,Content_type)以外的Resonse标题已成功更新。 – namalfernandolk

回答

1

集内容类型。 使用HttpServletResponseWrapper并重写setContentType来包装response并传递给child.doFilter。被覆盖的setContentType应该忽略任何改变内容类型的尝试。

的代码片段:

// Setting content type 
httpServletResponse.setContentType("you-content-type"); 
chain.doFilter(httpServletRequest, new HttpServletResponseWrapper(httpServletResponse) { 
    @Override 
    public void setContentType(final String type) { 
     // Ignore any further attempts to change content type 
    } 
}); 
+0

谢谢kgeorgly。让我试试看! – namalfernandolk

+0

是的!有效! kgeogiy!万分感谢! – namalfernandolk

+0

kgeorgiy,一件小事。在我的情况下,我想在内容类型中发送一个空格(例如:text/xml; charset = utf-8)。现在内容类型更新时没有空格。你有什么想法吗? – namalfernandolk

相关问题