它来自 Ordering of filters, servlets in Jetty-9.2.2
如上所述 "将安全逻辑拆分为Servlet过滤器和您的自定义javax.websocket.server.ServerEndpointConfig.Configurator可以使用的独立类。"
我不确定如何实现这个?有人可以解释一下吗?
答案 0 :(得分:1)
HTTP升级(又名websocket)请求到了,会发生什么?
容器看到它有各种标题,表明它是websocket的升级请求。
GET
吗?Upgrade
标头值WebSocket
?Sec-WebSocket-Key
标头值是否存在且有效?Sec-WebSocket-Version
标头值是否存在且有效?容器尝试查找某些内容是否映射到该传入请求(使用servlet路径映射规则和javax.websocket uri模板路径映射规则的组合)。
从上述规则中发现注册端点后,必须先将其初始化并进行配置,然后才能将其视为开放。
使用该端点的ServerEndpointConfig
(所有端点都注册了此类,其中一些是默认值,一些是根据注释计算的,一些是通过ServerContainer.addEndpoint(ServerEndpointConfig)
方法提供的
以下顺序用于初始化websocket端点
HandshakeRequest
和HandshakeResponse
对象Configurator
ServerEndpointConfig.getConfigurator()
Configurator.modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response)
Configurator.checkOrigin(String origin)
- 如果失败,则返回立即错误403 Forbidden Configurator.getNegotiatedSubprotocol(List<String> supported, List<String> requested)
- 如果提供了子协议,则用于WebSocket升级响应标头Sec-WebSocket-Protocol
Configurator.getNegotiatedExtensions(List<Extension> installed, List<Extension> requested)
- 返回的值用于WebSocket升级响应标头Sec-WebSocket-Extensions
ServerEndpointConfig
的端点类参数的容器调用Configurator.getEndpointInstance(Class<T> endpointClass)
Endpoint
+ Session
并打开websocket。如果您在任何时候都不希望升级此请求,只需从getEndpointInstance
类中抛出异常即可。我推荐java.lang.InstantiationException
。
这将导致Jetty不执行升级并将请求发送到servlet处理链。
请注意,您对配置器中http响应的看法极为有限(而且根据JSR-356 / javax.websocket规范未定义)。