2017-08-23 3 views
1

私はシナリオを持っています。いくつかのユーティリティの依存関係に依存私のspringbootアプリケーションにヘッダーが転送されていません。私はフィルタを作成しようとしましたが、その中にリクエストラッパーを作成しました。 より優れたソリューションのフィルタのみ、またはラッパーのみを使用する必要がありますか?余分なヘッダーを追加するためにラッパーまたはフィルターを使用しますか?

私のコードは以下のとおりです。うまくいきますが、最適化したかったです。

@Component 
public class AddVersionFilter implements Filter{ 
private static final Logger log = 
LoggerFactory.getLogger(AddVersionFilter.class); 
@Override 
public void init(FilterConfig filterConfig) throws ServletException { 
    // TODO Auto-generated method stub 

} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, 
     ServletException { 
    // TODO Auto-generated method stub 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(httpRequest) {   

     public String getHeader(String name) { 
      String header = super.getHeader(name); 
      if(name.equalsIgnoreCase("Version") && header == null) 
      { 
       log.info("Setting Version"); 
       return "23"; 
      } 
      else 
      { 
       log.info("other headers"); 
      return (header != null) ? header : super.getParameter(name); // Note: you can't use getParameterValues() here. 
      } 
     } 

     public Enumeration<String>getHeaderNames() { 
      List<String> names = Collections.list(super.getHeaderNames()); 
      names.addAll(Collections.list(super.getParameterNames())); 
      names.add("Version"); 
      log.info(names.toString()); 
      return Collections.enumeration(names); 

     } 

    }; 

    chain.doFilter(wrapper, response); 
    log.info(" schema version " +httpRequest.getHeader("Version")); 

} 

@Override 
public void destroy() { 
    // TODO Auto-generated method stub 

} 

}

答えて

0

だから私は、フィルタを作ってみましたし、その中に要求ラッパーを作成しました。より良い解決策だけがフィルタか、またはラッパーだけが使用されるべきですか?

ラッパーとフィルターを併用する必要があります。フィルタにラッパーを作成し、chain.doFilter(...)の呼び出しでラッパーを渡します。上のコードはそのように書かれており、良いです。観測

  1. カップルは、それが)(...のgetHeaderへの呼び出しでパラメータ名と値を返すのが普通ですか?私はあなたのコードの2つの場所でそれを参照してください。既定の要求オブジェクトの動作を確認することができます。

  2. getHeaders(name)をHttpServletRequestObjectからオーバーライドしたい場合があります。

+0

パラメータとして設定されていても、null以外の値を返すことを目的としていました。 –

関連する問題