2016-11-06 4 views
1

ServletFilterを使用してServletResponse Content-Typeを変更しようとしました。しかし、サーブレット(私のコンテンツのAxisServlet)は、chain.doFilter()が呼び出すときにContent-Typeを更新します。しかし、他の応答ヘッダーは正しく更新されます。Servlet処理がServeletFilterを使用して行われた後の応答Content-Typeの更新方法

doFilterが呼び出された後に応答ヘッダーを設定しようとしました。この時点では、応答ヘッダーは更新されませんでした。

Serveltの完了後にServletResponseのContent-Typeを更新する方法を知っている人はいますか?

コード:オリジナルresponseにコンテンツタイプを設定し

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の

<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は、init()メソッドの後に値がロードしていましたか? – 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

ありがとうございました。私はそれを試してみましょう! – namalfernandolk

+0

はい!出来た! kgeogiy!大いに感謝する! – namalfernandolk

+0

kgeorgiy、一つの小さなもの。私の場合は、コンテンツタイプ(例えば、text/xml; charset = utf-8)内にスペースを入れたいと思っています。コンテンツタイプはスペースなしで更新されます。あなたはこれについて考えていますか? – namalfernandolk

関連する問題