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
相关产品推荐
相关产品推荐

