在Jetty-9.2.2中对过滤器,servlet进行排序

时间:2014-09-09 09:41:36

标签: servlets jetty cometd jetty-9

我正在jetty-9.2.2中部署CometD-3.0.1。

我有自己的过滤器,我想为每个请求调用。我已按特定顺序在web.xml中指定了这些过滤器。

但是使用WebSocket,容器必须找到一种方法来处理升级请求。在Jetty中,这是由Servlet过滤器完成的,Servlet过滤器总是被ServletContainerInitializer添加为第一个过滤器。 所以在我的情况下,升级请求永远不会到达我的过滤器,因为链接前面的WS过滤器会在点击我的过滤器之前进行升级。

我该怎么做才能在Jetty的WS过滤器之前首先调用我的过滤器?

谢谢, Anuj

1 个答案:

答案 0 :(得分:2)

简而言之,在websocket升级上运行servlet过滤器是不可能的。

通过过滤器处理WebSocket升级的jetty选择只是我们对Servlet和WebSocket规范的特定实现。其他实现可能使用不同的技术。

有两点需要了解。

  1. 如果容器已在已知路径映射/路径规范上配置了WebSocket端点,则在所有servlet处理之前处理所有到达的升级请求。 Jetty选择通过内部过滤器执行此操作,其他实现通过特殊处理执行此操作,然后将其处理到servlet链。

  2. Servlet在servlet规范的早期不鼓励过滤websocket升级,因为过滤器可以做的大多数更改都会导致websocket升级出现问题。有一个简短的讨论,拒绝一些已知会导致问题的代码路径(比如访问请求内容或响应内容,在请求或响应中设置标头等等。)但这被证明是太具侵略性,所以它被声明为不可能而且气馁。

  3. 现在,你应该知道如果websocket升级没有发生,并且没有错误,那么servlet处理链确实会为该请求启动。

    这里的一个典型问题是有些人围绕过滤器构建了安全性,这对Servlet很有用,但对WebSockets则不行。

    如果是这种情况,那么你就有了一些工作。

    选择以下内容:

    • 使用容器的安全层实现安全性(在任何处理websockets或servlet之前总是会发生)