2

doFilter()関数の実行が終了した後、HTTPヘッダーを追加したいと思います。

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

  try {
    chain.doFilter(request, httpResp);

  } finally {           
    httpResp.setHeader("ADD A HEADER: ", "HEADER");
  }                                     
}

doFilter応答をフラッシュするようです。


アップデート:

ありがとう。IgorMadjericとrichardtzの回答を見た後、応答ラッパーを試すことにしました。


これはラッパーです。

public class BufferedHttpServletResponse extends HttpServletResponseWrapper {

public BufferedHttpServletResponse(HttpServletResponse response) {
    super(response);
}

public void flushBuffer() {
    System.out.println("flush");
}

}

これは変更されたコードです:

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

    try {
        BufferedHttpServletResponse bufferedResponse = new BufferedHttpServletResponse(httpResp);
        chain.doFilter(request, bufferedResponse);

    } finally {         
        bufferedResponse.setHeader("ADD A HEADER: ", "HEADER");
    }                                       
}

まだ動作していません。私は何か間違ったことをしましたか?

4

3 に答える 3

3

ヘッダーがフラッシュ/コミットされた後(すでにクライアントに送信されている場合)、ヘッダーの応答を変更することはできません。

doFilterは応答をフラッシュしませんが、要求の実行中に多くのことが原因で応答が発生する可能性があります。(response.flush()の明示的な呼び出し、応答の本体が大きすぎます)、これを制御することはできません。

ただし、これを変更するにはHttpServletResponseWrapperを使用できます。

それが役に立てば幸い。

于 2012-10-02T07:32:47.483 に答える
1

コメントとこの質問ですでに述べたように、flushBuffer()を上書きするだけでは不十分かもしれませんが、getWriter()とgetOutputStream()も上書きする必要があります。場合によっては、それでも十分ではない可能性があります。たとえば、応答でsendError(int)が呼び出された場合、それもコミットされる可能性があります。

于 2015-09-23T21:08:37.657 に答える
0

あなたが投稿したコードからのあなたの場合、あなたは言うことができません:

doFilterが応答をフラッシュするようです。

応答のコミットにはいくつかのルールがあります。

フィルタリングした後、応答はおそらくいくつかのコンポーネントによってすでにコミットされています。

この動作を回避したい場合は、要求/応答ラッパーを使用する必要があります。これにより、フィルターが適用されて応答をコミットするコンポーネントが防止されます。

于 2012-10-02T07:30:17.537 に答える