You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty 9.4.8中AbstractHandler与WebSocketAdapter共存配置问题

搞定Jetty 9.4.x同时运行AbstractHandler与WebSocketAdapter的配置

我来帮你捋清楚怎么在Jetty 9.4.8里同时跑你的Foo(AbstractHandler)和Bar(WebSocketAdapter),其实核心就是利用Jetty的Handler集合类把不同的请求处理逻辑拆分到各自的上下文路径下,避免冲突。

核心思路

Jetty的Handler是链式处理模型,我们可以用HandlerCollection把处理普通HTTP的AbstractHandler和处理WebSocket的WebSocketServlet(你的Glue类)分别绑定到不同的上下文路径,让Jetty根据请求路径自动分发到对应的处理器。

具体代码实现

下面是完整的Server初始化配置代码,你可以直接参考复用:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;

public class JettyServerStarter {
    public static void main(String[] args) throws Exception {
        // 1. 创建Jetty Server实例,监听8080端口
        Server server = new Server(8080);

        // 2. 配置普通HTTP请求的Handler(你的Foo类)
        Foo fooHandler = new Foo();
        ContextHandler fooContext = new ContextHandler("/"); // 绑定根路径
        fooContext.setHandler(fooHandler);

        // 3. 配置WebSocket请求的处理(你的Glue和Bar类)
        ServletContextHandler wsContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
        wsContext.setContextPath("/ws"); // WebSocket绑定到/ws专属路径
        ServletHolder wsServletHolder = new ServletHolder("websocket", Glue.class);
        wsContext.addServlet(wsServletHolder, "/*"); // 该路径下所有请求都交给WebSocket处理

        // 4. 把两个上下文Handler加到集合里,交给Server统一管理
        HandlerCollection handlerCollection = new HandlerCollection();
        handlerCollection.addHandler(fooContext);
        handlerCollection.addHandler(wsContext);
        server.setHandler(handlerCollection);

        // 5. 启动Server并阻塞等待
        server.start();
        server.join();
    }
}

关键注意事项

  • 路径隔离:一定要给普通HTTP和WebSocket设置不同的上下文路径(比如根路径/和/ws),否则Jetty会优先匹配先加入的Handler,导致另一个逻辑无法生效。
  • 依赖检查:确保你的项目里引入了和jetty-server同版本的jetty-websocket-servlet依赖(9.4.8.v20171121),否则会出现WebSocketServlet类找不到的问题。
  • 测试验证:启动后,普通HTTP请求访问http://localhost:8080/会被Foo处理,WebSocket客户端连接ws://localhost:8080/ws会触发Bar的WebSocket回调逻辑。

内容的提问来源于stack exchange,提问作者user2329125

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:30:43