我正在jetty-9.2.2中部署CometD-3.0.1。
我有自己的过滤器,我想为每个请求调用。我已按特定顺序在web.xml中指定了这些过滤器。
但是使用WebSocket,容器必须找到一种方法来处理升级请求。在Jetty中,这是由Servlet过滤器完成的,Servlet过滤器总是被ServletContainerInitializer添加为第一个过滤器。 所以在我的情况下,升级请求永远不会到达我的过滤器,因为链接前面的WS过滤器会在点击我的过滤器之前进行升级。
我该怎么做才能在Jetty的WS过滤器之前首先调用我的过滤器?
谢谢, Anuj
答案 0 :(得分:2)
简而言之,在websocket升级上运行servlet过滤器是不可能的。
通过过滤器处理WebSocket升级的jetty选择只是我们对Servlet和WebSocket规范的特定实现。其他实现可能使用不同的技术。
有两点需要了解。
如果容器已在已知路径映射/路径规范上配置了WebSocket端点,则在所有servlet处理之前处理所有到达的升级请求。 Jetty选择通过内部过滤器执行此操作,其他实现通过特殊处理执行此操作,然后将其处理到servlet链。
Servlet在servlet规范的早期不鼓励过滤websocket升级,因为过滤器可以做的大多数更改都会导致websocket升级出现问题。有一个简短的讨论,拒绝一些已知会导致问题的代码路径(比如访问请求内容或响应内容,在请求或响应中设置标头等等。)但这被证明是太具侵略性,所以它被声明为不可能而且气馁。
现在,你应该知道如果websocket升级没有发生,并且没有错误,那么servlet处理链确实会为该请求启动。
这里的一个典型问题是有些人围绕过滤器构建了安全性,这对Servlet很有用,但对WebSockets则不行。
如果是这种情况,那么你就有了一些工作。
选择以下内容:
或