Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Управление Cookie

Введение

Механизм управления состоянием HTTP определяет способ создать stateful сеанс с запросами HTTP и ответами. Спецификация для этого может быть найдена в RFC 2965: Механизм управления состоянием HTTP в http://www.ietf.org/rfc/rfc2965.txt?number=2965.

Поддержка перед тигром

До Тигра было возможно добавить управление Cookie к приложениям. Но API поддержки был несколько элементарным. Не было никакой единственной точки, поднимают трубку с управлением cookie. Каждое приложение должно было обработать cookie для каждого запроса/ответа HTTP отдельно при использовании следующих двух методов от java.net. Класс URLConnection:

setRequestProperty()
getHeaderFields()

Первый метод нужно вызвать перед отсылкой запроса HTTP, чтобы установить соответствующие cookie для текущего URL в HTTP-заголовках. Второй метод должен использоваться, чтобы получить cookie от заголовков ответа, отправленных сервером HTTP.

Хотя выполнимый, добавляя поддержку Cookie таким образом приводит к фрагментированному коду, который подвержен ошибкам и подвергается высокому обслуживанию.

Новые функции и возможности у Тигра?

Мы представили новый механизм обратного вызова через абстрактный класс, чтобы поднять трубку реализацию политики управления состоянием HTTP в обработчик протокола HTTP. Приложения и веб-контейнеры могут представить управление Cookie, обеспечивая конкретный подкласс нового API.

Новый абстрактный класс вызывают java.net. CookieHandler. Это обеспечивает механизм, чтобы зарегистрировать и получить текущий CookieHandler для JVM, так же как методы, чтобы получить и записать соответствующие cookie для определенного URI.

Есть два статических метода в CookieHandler getDefault () и setDefault () для получения и регистрации CookieHandler по умолчанию в VM. Так же как два метода экземпляра получают () и помещают () для того, чтобы возвратить список cookie, основанных на URL, и хранит список cookie от заголовков ответа, соответственно.

Cookie представляются как Карта <Строка, Список <Строка>>, Карта от имени поля заголовка для cookie к списку cookie, представленных Строками. Есть заголовки управления с двумя состояниями, определяемые до сих пор, "Набор-Cookie2" и "Cookie". Прежний используется для того, чтобы возвратить cookie в заголовках ответа; в то время как последний для того, чтобы установить cookie в заголовках запроса HTTP.

Вот пример от RFC2965:

1. Агент пользователя-> Сервер

POST/acme/login HTTP/1.1
[данные формы]

2. Сервер-> Агент пользователя

HTTP/1.1 200 OK
Набор-Cookie2: Клиент = "WILE_E_COYOTE"; Версия = "1"; Путь = "/acme"

3. Агент пользователя-> Сервер

POST/acme/pickitem HTTP/1.1
Cookie: $Version = "1"; Клиент = "WILE_E_COYOTE"; $Path = "/acme"
[данные формы]

Простой Пример

Вот простой пример реализации CookieHandler. В основном есть два метода, чтобы реализовать, учитывая URI запроса и заголовки запроса (кроме заголовков cookie), получить все соответствующие cookie от Вашего кэша cookie; и запишите применимые cookie к своему кэшу cookie, данному URI запроса и заголовки ответа.

class MyCookieHandler extends CookieHandler {
        public Map<String, List<String>>
                get(URI uri, Map<String, List<String>> requestHeaders)
                throws IOException {
                // the cookies will be included in request
                Map<String, List<String>> map = new HashMap<String, List<String>>();
                List<String> l = retrieveCookies(uri, rqstHdrs);
                map.put("Cookie",l);
                return Collections.unmodifiableMap(map);
        }

        public void
                put(URI uri, Map responseHeaders)
                throws IOException {
            // check response has cookies[1]
                List l = (List)responseHeaders.get("Set-Cookie2");
            if (l != null) {
                        // save the cookies in a cookie cache
                 storeCookies(uri, l);
            }
        }
}

Методы retrieveCookies() и storeCookies() "волшебные" функции для того, чтобы взаимодействовать со средством управления cookie бэкэнда, которое опускается в этом примере.

Как только это регистрируется в VM, это вступит в силу, когда Вы выпустите транзакции HTTP.

public static void main(String args[]) throws Exception {
        ......
        CookieHandler.setDefault(new MyCookieHandler());
        HttpURLConnection http = (HttpURLConnection)url.openConnection();

        int respCode = http.getResponseCode();
        http.disconnect();
        ......
}

Нет никакой реализации по умолчанию менеджера по cookie в J2SE. Однако, это может измениться в будущем. Плагин Java и Java WebStart предоставляют CookieHandler по умолчанию в их среде.


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами