![]() |
Spec-Zone .ru
спецификации, руководства, описания, API
|
Механизм управления состоянием HTTP определяет способ создать stateful сеанс с запросами HTTP и ответами. Спецификация для этого может быть найдена в RFC 2965: Механизм управления состоянием HTTP в
До Тигра было возможно добавить управление Cookie к приложениям. Но API поддержки был несколько элементарным. Не было никакой единственной точки, поднимают трубку с управлением cookie. Каждое приложение должно было обработать cookie для каждого запроса/ответа HTTP отдельно при использовании следующих двух методов от java.net. URLConnection class:
setRequestProperty()
getHeaderFields()
Первый метод нужно вызвать перед отсылкой запроса HTTP, чтобы установить соответствующие cookie для текущего URL в HTTP-заголовках. Второй метод должен использоваться, чтобы получить cookie от заголовков ответа, отправленных сервером HTTP.
Хотя выполнимый, добавляя поддержку Cookie таким образом приводит к фрагментированному коду, который подвержен ошибкам и подвергается высокому обслуживанию.
Мы представили новый механизм обратного вызова через абстрактный class, чтобы поднять трубку реализацию политики управления состоянием HTTP в обработчик протокола HTTP. Приложения и веб-контейнеры могут представить управление Cookie, обеспечивая конкретный подкласс нового API.
Новый абстрактный class вызывают 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 в их среде.