Servlets Jetty-9.2.2中过滤器和小配件的订购

Servlets Jetty-9.2.2中过滤器和小配件的订购,servlets,jetty,cometd,jetty-9,Servlets,Jetty,Cometd,Jetty 9,我正在jetty-9.2.2中部署CometD-3.0.1 我有我自己的过滤器,我想为每个请求调用它。我已经在web.xml中按特定顺序指定了这些过滤器 但是使用WebSocket,容器必须找到处理升级请求的方法。在Jetty中,这是由ServletContainerInitializer始终作为第一个过滤器添加的servlet过滤器完成的。 因此,在我的例子中,升级请求永远不会命中我的筛选器,因为位于链前面的WS-filter将在命中我的筛选器之前进行升级 我应该怎么做才能在Jetty的WS-

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

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

但是使用WebSocket,容器必须找到处理升级请求的方法。在Jetty中,这是由ServletContainerInitializer始终作为第一个过滤器添加的servlet过滤器完成的。 因此,在我的例子中,升级请求永远不会命中我的筛选器,因为位于链前面的WS-filter将在命中我的筛选器之前进行升级

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

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

在jetty中,由过滤器处理WebSocket升级的选择就是我们对Servlet和WebSocket规范的具体实现。其他实现可能使用不同的技术

关于这一点,有两件事需要理解

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

  • 在Servlet规范的早期,不鼓励对websocket升级进行Servlet过滤,因为过滤器所做的任何更改都会导致websocket升级出现问题。有人简短地谈论过拒绝一些已知会导致问题的代码路径(如访问请求内容或响应内容、在请求或响应中设置头等等),但事实证明这太具有侵入性,因此被宣布为不可能并不鼓励

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

    这里的一个典型问题是,一些人已经围绕过滤器构建了他们的安全性,这对servlet是好的,但对WebSocket不是

    如果是这样的话,那么你还有一些工作要做

    选择以下各项:

    • 将安全逻辑拆分为一个独立的类,您的Servlet过滤器和您的客户可以使用该类

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

    有人看到过这个吗?谢谢你的详细解释。正如您提到的,“在Servlet规范的早期,不鼓励对websocket升级进行Servlet过滤”。你能给我指一下规范或讨论这一点的链接吗?在我的例子中,我使用Comet并将其部署到jetty中…正如你提到的“使用容器的安全层实现安全性”。。。。。什么是安全层,我不明白?……话虽如此,我只想在websocket中使用kerberos crediential。我应该如何在请求中传递kerberos凭据?如果您在浏览器中使用javascript,现有javascript WebSocket API没有已知的方法来传递这些凭据。(使用此API我们几乎无法在URL/URI中传递基本身份验证)>使用此API我们几乎无法在URL/URI中传递基本身份验证…..您能告诉我如何在URL中传递基本身份验证标头吗?正如您在回答中提到的:“使用容器的安全层实现安全性”。。。。。如何使用容器的安全层实现安全性?.ws://{user}:{password}@{host}/{path}