Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Обработка обновления протокола

В HTTP/1.1 клиенты могут запросить переключение на другой протокол в текущем соединении, используя поле заголовка Upgrade. Если сервер принимает запрос переключения на протокол, указанный клиентом, он генерирует HTTP-ответ со статусом 101 (переключение протоколов). После этого обмена клиент и сервер обмениваются данными по новому протоколу.

Например, клиент может сделать HTTP-запрос для переключения на протокол XYZP следующим образом:

GET /xyzpresource HTTP/1.1
Host: localhost:8080
Accept: text/html
Upgrade: XYZP
Connection: Upgrade
OtherHeaderA: Value

Клиент может указать параметры для нового протокола, используя заголовки HTTP. Сервер может принять запрос и сгенерировать ответ следующим образом:

HTTP/1.1 101 Switching Protocols
Upgrade: XYZP
Connection: Upgrade
OtherHeaderB: Value

(XYZP data)

Java EE поддерживает функцию обновления протокола HTTP в сервлетах, как описано в табл. 18-7.

Таблица 18-7. Поддержка обновления протокола

Класс или интерфейс

Метод

HttpServletRequest

HttpUpgradeHandler upgrade(Class handler)

Метод обновления запускает обработку обновления протокола. Этот метод создаёт объект класса, который реализует интерфейс HttpUpgradeHandler и делегирует ему соединение.

Вызывайте метод upgrade внутри сервисного метода, когда принимаете запрос от клиента на переключение протоколов.

HttpUpgradeHandler

void init(WebConnection wc)

Метод init вызывается, когда сервлет принимает запрос переключения протокола. Реализуйте этот метод и получите входные и выходные потоки из объекта WebConnection для реализации нового протокола.

HttpUpgradeHandler

void destroy()

Метод destroy вызывается, когда клиент выключается. Реализуйте этот метод и освободите все ресурсы, связанные с обработкой нового протокола.

WebConnection

ServletInputStream getInputStream()

Метод getInputStream обеспечивает доступ к входному потоку соединения. Вы можете использовать неблокирующий ввод/вывод с возвращённым потоком для реализации нового протокола.

WebConnection

ServletOutputStream getOutputStream()

Метод getOutputStream обеспечивает доступ к выходному потоку соединения. Вы можете использовать неблокирующий ввод/вывод с возвращённым потоком для реализации нового протокола.

Следующий код демонстрирует, как принять запрос на обновление протокола HTTP от клиента:

@WebServlet(urlPatterns={"/xyzpresource"})
public class XYZPUpgradeServlet extends HttpServlet {
   @Override
   public void doGet(HttpServletRequest request,
                     HttpServletResponse response) {
      if ("XYZP".equals(request.getHeader("Upgrade"))) {
         /* Принятие запроса upgrade */
         response.setStatus(101);
         response.setHeader("Upgrade", "XYZP");
         response.setHeader("Connection", "Upgrade");
         response.setHeader("OtherHeaderB", "Value");
         /* Делегирование соединения обработчику */
         XYZPUpgradeHandler = request.upgrade(XYZPUpgradeHandler.class);
         /* (немедленный возврат из сервисного метода) */
      } else {
         /* ... запись ошибки в ответ... */
      }
   }
}

Класс XYZPUpgrityHandler обрабатывает подключение:

public class XYZPUpgradeHandler implements HttpUpgradeHandler {
   @Override
   public void init(WebConnection wc) {
      ServletInputStream input = wc.getInputStream();
      ServletOutputStream output = wc.getOutputStream();
      /* ... реализация XYZP используя потоки (специфично для протокола) ... */
   }
   @Override
   public void destroy() { ... }
}

Класс, который реализует HttpUpgradeHandler, использует потоки из текущего соединения для связи с клиентом, используя новый протокол. См. Спецификацию Servlet 4.0 на http://jcp.org/en/jsr/detail?id=369 для получения подробной информации о поддержке обновления протокола HTTP.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)