Подтвердить что ты не робот

Есть ли способ читать файлы cookie из объекта ответа в Java?

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

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

Я знаю, что файлы cookie, как правило, отвечают за браузер, и я помню, что в .NET не было никакого способа сделать это. Просто надеюсь, что Java может быть другим...

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

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

4b9b3361

Ответ 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.