web-dev-qa-db-ja.com

Javaで応答オブジェクトからCookieを読み取る方法はありますか?

HttpServletResponseがこれを行うためのメソッドを公開していないようです。

今、私はそれが何をするのかを正確に理解するために、たくさんのロギングコードを不器用でよく理解されていないサーブレットに追加しています。それがたくさんのクッキーを設定することは知っていますが、いつ、なぜ、何をするのかわかりません。サーブレットの実行の最後に、HttpServletResponseオブジェクトにすべてのCookieを記録するだけでよいでしょう。

通常、Cookieはブラウザの責任であり、.NETではこれを行う方法がなかったことを覚えています。 Javaが異なる可能性があることを願っています...

しかし、これが不可能な場合、私がやろうとしていることを達成する方法について他のアイデアはありますか?

いつものように、ありがとう。

20
sangfroid

ロギングだけが必要な場合は、提供されたHttpServletResponseをラッパーでラップするjavax.servlet.Filterの実装を作成することをお勧めします。これにより、フィルターの実行後にCookieを公開できます。このようなもの:

public class CookieLoggingFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException ,ServletException {
        ResponseWrapper wrappedResponse = new ResponseWrapper((HttpServletResponse) response);

        filterChain.doFilter(request, wrappedResponse);

        // use a real logger here, naturally :)
        System.out.println("Cookies: " + wrappedResponse.cookies); 
    }

    private class ResponseWrapper extends HttpServletResponseWrapper {

        private Collection<Cookie> cookies = new ArrayList<Cookie>();

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

        @Override
        public void addCookie(Cookie cookie) {
            super.addCookie(cookie);
            cookies.add(cookie);
        }
    }

       // other methods here
}

1つの大きな警告:これはnotではなく、どのCookieがブラウザーに返送されるかを示し、アプリケーションコードが応答に追加したCookieのみを示します。 。コンテナがこれらのCookieを変更、追加、または無視することを選択した場合(たとえば、セッションCookieはアプリケーションではなくコンテナによって処理されます)、このアプローチを使用するかどうかはわかりません。しかし、それはあなたの状況にとって重要ではないかもしれません。

確実にする唯一の方法は、 FirefoxのライブHTTPヘッダー のようなブラウザプラグイン、または中間者HTTPロギングプロキシを使用することです。

16
skaffman

HttpServletResponseを受け入れるサードパーティライブラリを使用していて、応答オブジェクトに設定されたCookieを読み戻す必要がある場合にも同じ問題が発生しました。これを解決するために、呼び出しを行った後にこれらのCookieを公開するHttpServletResponseWrapper拡張機能を作成しました。

public class CookieAwareHttpServletResponse extends HttpServletResponseWrapper {

    private List<Cookie> cookies = new ArrayList<Cookie>();

    public CookieAwareHttpServletResponse (HttpServletResponse aResponse) {
        super (aResponse);
    }

    @Override
    public void addCookie (Cookie aCookie) {
        cookies.add (aCookie);
        super.addCookie(aCookie);
    }

    public List<Cookie> getCookies () {
        return Collections.unmodifiableList (cookies);
    }

} 

そして私がそれを使う方法:

// wrap the response object
CookieAwareHttpServletResponse response = new CookieAwareHttpServletResponse(aResponse);

// make the call to the 3rd party library 
String order = orderService.getOrder (aRequest, response, String.class);

// get the list of cookies set
List<Cookie> cookies = response.getCookies();
10
acohen

唯一のアプローチは、HttpServletResponseオブジェクトをラップして、Cookieが設定されたときにaddCookieメソッドがインターセプトしてログに記録できるようにすることです。これを行うには、既存のHttpServletResponseをサーブレットに渡す前にラップするServletFilterを追加します。

5
Dean Povey

Cookieは、「Set-Cookie」応答ヘッダーでクライアントに送信されます。これを試して:

private static void logResponseHeaders(HttpServletResponse httpServletResponse) {

    Collection<String> headerNames = httpServletResponse.getHeaderNames();

    for (String headerName : headerNames) {
        if (headerName.equals("Set-Cookie")) {
            log.info("Response header name={}, header value={}", headerName, httpServletResponse.getHeader(headerName));
        }
    }
}
0
user674669