0

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

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

但是对于 WebSocket,容器必须找到一种方法来处理升级请求。在 Jetty 中,这是由 Servlet 过滤器完成的,该过滤器始终由 ServletContainerInitializer 作为第一个过滤器添加。所以在我的例子中,升级请求永远不会命中我的过滤器,因为位于链前面的 WS 过滤器会在命中我的过滤器之前进行升级。

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

谢谢, 阿努杰

4

1 回答 1

2

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

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

有两件事要理解。

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

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

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

这里的一个典型问题是,有些人围绕过滤器构建了他们的安全性,这对 Servlet 有好处,但对 WebSocket 则不然。

如果是这种情况,那么您还有一些工作要做。

选择以下:

或者

  • 使用容器的安全层实现您的安全性(总是在处理 websocket 或 servlet 之前发生)
于 2014-09-09T14:38:48.287 回答