2.11 Upgrade Processing
HTTP 1.1(RFC 2616)第14.42节定义的升级机制,允许从HTTP 1.1过渡到一些其他的、不兼容的协议。协议变更后的应用层通信的功能和性质是完全依赖于所选择的新的协议。在客户端和服务器之间协商升级后,后续请求使用新选择的协议交换消息。一个典型的例子是RFC 6455的Opening Handshake一节中描述的如何从HTTP协议升级到WebSocket协议。
Servlet容器提供了一个HTTP升级机制。然而,Servlet容器本身不感知升级协议。协议处理被封装在HttpUpgradeHandler中。Servlet容器和HttpUpgradeHandler之间的数据读写的形式是字节流。
由Servlet.service()方法决定是否升级。升级是通过添加一个新的方法HttpServletRequest.upgrade()和两个新的接口javax.servlet.http.HttpUpgradeHandler和javax.servlet.http.WebConnection来实现的:
请求处理查找头信息中的Upgrade字段并基于其值决定是否升级。在这个例子中,如果Upgrade字段值等于echo,连接就会升级。响应状态和头信息被正确设置。upgrade()方法被HttpServletRequest调用,并传递一个HttpUpgradeHandler实例。
在退出Servlet的service方法后,Servlet容器完成所有过滤器的处理,并标记由HttpUpgradeHandler的实例来处理连接:
这段代码显示了HttpUpgradeHandler的实现。Servlet容器调用HttpUpgradeHandler的init()方法,传递一个WebConnection实例以允许协议Handler访问数据流。当升级处理完成后,HttpUpgradeHandler.destroy()方法被调用。
Servlet过滤器只处理初始的HTTP请求和响应,不参与后续的通信。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。