HttpServletResponseがこれを行うためのメソッドを公開していないようです。
今、私はそれが何をするのかを正確に理解するために、たくさんのロギングコードを不器用でよく理解されていないサーブレットに追加しています。それがたくさんのクッキーを設定することは知っていますが、いつ、なぜ、何をするのかわかりません。サーブレットの実行の最後に、HttpServletResponseオブジェクトにすべてのCookieを記録するだけでよいでしょう。
通常、Cookieはブラウザの責任であり、.NETではこれを行う方法がなかったことを覚えています。 Javaが異なる可能性があることを願っています...
しかし、これが不可能な場合、私がやろうとしていることを達成する方法について他のアイデアはありますか?
いつものように、ありがとう。
ロギングだけが必要な場合は、提供された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ロギングプロキシを使用することです。
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();
唯一のアプローチは、HttpServletResponseオブジェクトをラップして、Cookieが設定されたときにaddCookieメソッドがインターセプトしてログに記録できるようにすることです。これを行うには、既存のHttpServletResponseをサーブレットに渡す前にラップするServletFilterを追加します。
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));
}
}
}