Есть ли способ прочитать куки из объекта ответа в Java? - PullRequest
18 голосов
/ 18 августа 2010

Не похоже, что HttpServletResponse предоставляет какие-либо методы для этого.

Прямо сейчас я добавляю кучу кода регистрации в грубый и непонятный сервлет, пытаясь выяснить, что именно он делает.Я знаю, что это устанавливает кучу файлов cookie, но я не знаю, когда, почему или что.Было бы неплохо просто записать все куки в объект HttpServletResponse в конце выполнения сервлета.

Я знаю, что куки, как правило, являются обязанностью браузера, и я помню, что не было никакого способа сделать это.СЕТЬ.Просто надеясь, что Java может отличаться ...

Но если это невозможно - какие-нибудь другие идеи о том, как выполнить то, что я пытаюсь сделать?

Спасибо, как всегда.

Ответы [ 3 ]

16 голосов
/ 18 августа 2010

Если ведение журнала - это все, что вам нужно, тогда я предлагаю написать реализацию 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 обрабатываются контейнером, а не приложением), вы не узнаете, используя этот подход. Но это может не иметь значения для вашей ситуации.

Единственный способ убедиться в этом - использовать плагин для браузера, такой как Live Http Headers для Firefox , или прокси-сервер для ведения журнала HTTP-посредник.

10 голосов
/ 17 июля 2013

У меня была та же проблема, когда я использовал стороннюю библиотеку, которая принимает HttpServletResponse, и мне нужно было прочитать файлы cookie, которые она установила для моего объекта ответа.Чтобы решить эту проблему, я создал расширение HttpServletResponseWrapper, которое предоставляет мне эти файлы cookie после выполнения вызова:

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();
5 голосов
/ 18 августа 2010

Ваш единственный подход - обернуть объект HttpServletResponse, чтобы методы addCookie могли перехватывать и регистрировать, когда установлены куки. Вы можете сделать это, добавив ServletFilter, который оборачивает существующий HttpServletResponse до его передачи в ваш сервлет.

...