[Java EE 7] Servlet 协议升级处理
程序员文章站
2022-03-02 11:02:12
...
HTTP 1.1 (RFC 2616)14.42 节定义了 HTTP 升级机制,允许你从 HTTP 1.1 过渡到其它兼容的协议。应用层的通信完全取决于升级后选择的协议。客户端和服务端完成协议升级后,后续请求都将使用新协议。典型的例子是如何将 HTTP 协议升级到 WebSocket,这在 RFC 6455 的 Opening Handshake 中有介绍。
Servlet 容器提供了协议升级机制,但容器本身没有包含关于新协议的辅助类,新协议处理都封装到 HttpUpgradeHandler 接口中进行。Servlet 容器和 HttpUpgradeHandler 之间的数据读写是通过字节流。
下面的例子中,在 Servlet.service 方法中决定是否升级协议,并使用到了一个新的方法:HttpServletRequest.upgrade,还有两个新的接口:javax.servlet.http.HttpUpgradeHandler 和 javax.servlet.http.WebConnection:
请求中判断了 Upgrade 头信息,用于判断是否需要进行协议升级。如果 Upgrade 的值是 echo,那么将会设置正确的响应 status 和头信息。request.upgrade 方法将会传入 HttpUpgradeHandler 接口实现 Class 类。
当请求离开 service 方法之后,servlet 容器处理完了所有的 filter,然后标记当前请求需要由 HttpUpgradeHandler 的实例处理。
上面的代码是 HttpUpgradeHandler 接口的一个实现样例。Servlet 将调用 HttpUpgradeHandler 的 init 方法,并传入 WebConnection 对象,使 HttpUpgradeHandler 能访问到数据,当升级过程完成后,HttpUpgradeHandler.destroy 方法将会被调用。
文章来源:http://www.aptusource.org/2014/04/java-ee-upgrade-processing/
Servlet 容器提供了协议升级机制,但容器本身没有包含关于新协议的辅助类,新协议处理都封装到 HttpUpgradeHandler 接口中进行。Servlet 容器和 HttpUpgradeHandler 之间的数据读写是通过字节流。
下面的例子中,在 Servlet.service 方法中决定是否升级协议,并使用到了一个新的方法:HttpServletRequest.upgrade,还有两个新的接口:javax.servlet.http.HttpUpgradeHandler 和 javax.servlet.http.WebConnection:
if (request.getHeader("Upgrade").equals("echo")) { response.setStatus(HttpServletResponse.SC_SWITCHING_PROTOCOLS); response.setHeader("Connection", "Upgrade"); response.setHeader("Upgrade", "echo"); request.upgrade(MyProtocolHandler.class); System.out.println("Request upgraded to MyProtocolHandler"); }
请求中判断了 Upgrade 头信息,用于判断是否需要进行协议升级。如果 Upgrade 的值是 echo,那么将会设置正确的响应 status 和头信息。request.upgrade 方法将会传入 HttpUpgradeHandler 接口实现 Class 类。
当请求离开 service 方法之后,servlet 容器处理完了所有的 filter,然后标记当前请求需要由 HttpUpgradeHandler 的实例处理。
public class MyProtocolHandler implements HttpUpgradeHandler { @Override public void init(WebConnection wc) { //. . . } @Override public void destroy() { //. . . } }
上面的代码是 HttpUpgradeHandler 接口的一个实现样例。Servlet 将调用 HttpUpgradeHandler 的 init 方法,并传入 WebConnection 对象,使 HttpUpgradeHandler 能访问到数据,当升级过程完成后,HttpUpgradeHandler.destroy 方法将会被调用。
文章来源:http://www.aptusource.org/2014/04/java-ee-upgrade-processing/