ServerEndpointConfig.Configurator如何工作

时间:2014-09-23 09:56:14

标签: servlets websocket jetty

它来自 Ordering of filters, servlets in Jetty-9.2.2

如上所述 "将安全逻辑拆分为Servlet过滤器和您的自定义javax.websocket.server.ServerEndpointConfig.Configurator可以使用的独立类。"

我不确定如何实现这个?有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

HTTP升级(又名websocket)请求到了,会发生什么?

  1. 容器看到它有各种标题,表明它是websocket的升级请求。

    • 请求方法是GET吗?
    • Upgrade标头值WebSocket
    • Sec-WebSocket-Key标头值是否存在且有效?
    • Sec-WebSocket-Version标头值是否存在且有效?
  2. 容器尝试查找某些内容是否映射到该传入请求(使用servlet路径映射规则和javax.websocket uri模板路径映射规则的组合)。

  3. 从上述规则中发现注册端点后,必须先将其初始化并进行配置,然后才能将其视为开放。

  4. 使用该端点的ServerEndpointConfig(所有端点都注册了此类,其中一些是默认值,一些是根据注释计算的,一些是通过ServerContainer.addEndpoint(ServerEndpointConfig)方法提供的

  5. 以下顺序用于初始化websocket端点

    1. Container建立表示传入原始升级请求的HandshakeRequestHandshakeResponse对象
    2. Container从Configurator
    3. 获取ServerEndpointConfig.getConfigurator()
    4. 容器调用Configurator.modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response)
    5. 容器调用Configurator.checkOrigin(String origin) - 如果失败,则返回立即错误403 Forbidden
    6. 容器调用Configurator.getNegotiatedSubprotocol(List<String> supported, List<String> requested) - 如果提供了子协议,则用于WebSocket升级响应标头Sec-WebSocket-Protocol
    7. 容器调用Configurator.getNegotiatedExtensions(List<Extension> installed, List<Extension> requested) - 返回的值用于WebSocket升级响应标头Sec-WebSocket-Extensions
    8. 使用使用。{/ li>创建ServerEndpointConfig的端点类参数的容器调用Configurator.getEndpointInstance(Class<T> endpointClass)
    9. 此时创建Endpoint + Session并打开websocket。
  6. 如果您在任何时候都不希望升级此请求,只需从getEndpointInstance类中抛出异常即可。我推荐java.lang.InstantiationException。 这将导致Jetty不执行升级并将请求发送到servlet处理链。

    请注意,您对配置器中http响应的看法极为有限(而且根据JSR-356 / javax.websocket规范未定义)。