定制初始 HTTP WebSocket 握手请求的最简单方法是通过 HandshakeInterceptor,它为握手的 「before」和 「after」暴露了方法。你可以使用这样的拦截器来排除握手,或使任何属性对 WebSocketSession 可用。下面的示例使用内置拦截器将 HTTP 会话属性传递给 WebSocket 会话:

    1. @Configuration
    2. @EnableWebSocket
    3. public class WebSocketConfig implements WebSocketConfigurer {
    4. @Override
    5. public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    6. registry.addHandler(new MyHandler(), "/myHandler")
    7. .addInterceptors(new HttpSessionHandshakeInterceptor());
    8. }
    9. }

    下面的例子显示了前述例子的 XML 配置等效:

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:websocket="http://www.springframework.org/schema/websocket"
    4. xsi:schemaLocation="
    5. http://www.springframework.org/schema/beans
    6. https://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/websocket
    8. https://www.springframework.org/schema/websocket/spring-websocket.xsd">
    9. <websocket:handlers>
    10. <websocket:mapping path="/myHandler" handler="myHandler"/>
    11. <websocket:handshake-interceptors>
    12. <bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor"/>
    13. </websocket:handshake-interceptors>
    14. </websocket:handlers>
    15. <bean id="myHandler" class="org.springframework.samples.MyHandler"/>
    16. </beans>

    一个更高级的选项是扩展 DefaultHandshakeHandler,它执行 WebSocket 握手的步骤,包括验证客户端来源、协商子协议和其他细节。如果应用程序需要配置自定义的 RequestUpgradeStrategy 以适应尚不支持的 WebSocket 服务器引擎和版本,也可能需要使用该选项(关于这个问题的更多信息,请参见 部署)。Java 配置和 XML 命名空间都可以配置自定义 HandshakeHandler。

    :::info Spring 提供了一个 WebSocketHandlerDecorator 基类,你可以用它来为 WebSocketHandler 装饰附加行为。在使用 WebSocket Java 配置或 XML 命名空间时,默认会提供并添加日志和异常处理实现。ExceptionWebSocketHandlerDecorator 捕获任何 WebSocketHandler 方法产生的所有未捕获的异常,并以状态 1011 关闭 WebSocket 会话,该状态表示一个服务器错误。 :::