2015-09-28 7 views
6

各応答にヘッダーを追加する必要があります。私は、コントローラのプロセス一度それは、私はちょうど、クライアントに を返す前にヘッダを追加するようfilterChain.doFilter(request, response)後にそれをしたいと思っフィルターで応答のヘッダーを追加しますか?

public class MyFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
            HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 

     filterChain.doFilter(request, response); 
      response.addHeader("Access-Control-Allow-Origin", "*"); 
    } 

} 

の下に行うことを計画しています。それが正しいか ? chain.doFilter

しかしHow to write response filter?

1としては、それが 応答で何かをするには遅すぎだ、戻ってきました。この時点で、回答はすべてクライアントの に送信されており、コードにはアクセスできません。

上記の声明は私にとっては正しくありません。 filterChain.doFilter(request, response)の後ろにヘッダーを追加できませんか?なぜそうならないのでしょうか?

私はspring mvcを使用しています。

+0

フィルタの代わりにSpring MVCインターセプタを使用できませんか? –

答えて

10

filterChain.doFilterが呼ばれた後は、応答が遅すぎます。この時点で、応答全体がすでにクライアントに送信されていました。

独自のクラスにラップレスポンスを作成し、これらのラッパーをdoFilterメソッドに渡し、ラッパーの処理を処理する必要があります。

拡張可能な応答ラッパー:HttpServletResponseWrapperが既に存在します。

public class MyResponseRequestWrapper extends HttpServletResponseWrapper{ 
    public MyResponseRequestWrapper(HttpServletResponse response) { 
     super(response); 
    } 
} 

あなたのフィルタ:たとえば

@Override 
protected void doFilterInternal(HttpServletRequest request, 
           HttpServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 

    HttpServletResponse myResponse = (HttpServletResponse) response; 
    MyResponseRequestWrapper responseWrapper = new MyResponseRequestWrapper(myResponse); 
    responseWrapper.addHeader("Access-Control-Allow-Origin", "*"); 
    filterChain.doFilter(request, myResponse); 
} 
+0

コンテナで渡された元の実装にヘッダーを追加するのではなく、あなたの例でラッパーを使用するのはなぜですか?私はあなたのヘッダーが削除/フィルターチェーンのどこかに上書きされていないことを確認するために内部にいくつかのロジックを実装する場合のみ、ラッパーが意味をなすと思います。 – troy

0

From perfect article

それがクライアントに返される前に、通常の応答を取得する必要があります応答を変更するフィルタ。これを行うには、レスポンスを生成するサーブレットにスタンバイストリームを渡します。スタンダード・ストリームは、完了したときにサーブレットが元の応答ストリームを閉じないようにし、フィルタがサーブレットの応答を変更できるようにします。

このスタンダードストリームをサーブレットに渡すために、フィルタはgetWriterまたはgetOutputStreamメソッドをオーバーライドするレスポンスラッパーを作成し、このスタンバイストリームを返します。ラッパーはフィルターチェーンのdoFilterメソッドに渡されます。ラッパーメソッドのデフォルトは、ラップされた要求または応答オブジェクトを呼び出すことです。このアプローチは、Design Patternsで説明されているよく知られたWrapperまたはDecoratorパターンに従います。

関連する問題