Есть ли способ читать файлы cookie из объекта ответа в Java?
Не похоже, что HttpServletResponse предоставляет любые методы для этого.
В настоящее время я добавляю кучу кода регистрации в жестокий и плохо понятый сервлет, пытаясь понять, что именно он делает. Я знаю, что он устанавливает кучу файлов cookie, но я не знаю, когда, почему или что. Было бы неплохо просто зарегистрировать все файлы cookie в объекте HttpServletResponse в конце выполнения сервлета.
Я знаю, что файлы cookie, как правило, отвечают за браузер, и я помню, что в .NET не было никакого способа сделать это. Просто надеюсь, что Java может быть другим...
Но если это невозможно - любые другие идеи о том, как выполнить то, что я пытаюсь сделать?
Спасибо, как всегда.
Ответы
Ответ 1
Если запись выполняется, вам предлагается написать реализацию javax.servlet.Filter
, которая обертывает поставляемый HttpServletResponse
в оболочку, который позволяет выставлять файлы 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
}
Одно большое предостережение. Это не покажет вам, какие файлы cookie будут отправлены обратно в браузер, он покажет вам, какие файлы cookie добавлены в ответ на код приложения. Если контейнер хочет изменить, добавить или игнорировать эти файлы cookie (например, куки сеанса обрабатываются контейнером, а не приложением), вы не будете знать, используя этот подход. Но это может не иметь значения для вашей ситуации.
Единственный способ убедиться в том, что использовать плагин для браузера, например Live Http Headers for Firefox или man-in-the-middle Прокси-сервер протокола HTTP.
Ответ 2
У меня была та же проблема, когда я использовал стороннюю библиотеку, которая принимает HttpServletResponse, и мне нужно было прочитать файлы 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();
Ответ 3
Ваш единственный подход заключается в том, чтобы обернуть объект HttpServletResponse, чтобы методы addCookie могли перехватывать и регистрироваться при настройке файлов cookie. Вы можете сделать это, добавив ServletFilter, который обертывает существующий HttpServletResponse, прежде чем он будет передан в ваш Servlet.