GET /xyzpresource HTTP/1.1
Host: localhost:8080
Accept: text/html
Upgrade: XYZP
Connection: Upgrade
OtherHeaderA: Value
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. Поддержка обновления протокола
Класс или интерфейс |
Метод |
|
Метод обновления запускает обработку обновления протокола. Этот метод создаёт объект класса, который реализует интерфейс Вызывайте метод |
|
Метод |
|
Метод |
|
Метод |
|
Метод |
Следующий код демонстрирует, как принять запрос на обновление протокола 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.
Назад | Вперёд | Содержание |