我正在尝试让普通的AbstractHandler和WebSocketAdapter同时工作。
jetty-version:jetty-9.4.8.v20171121,
我有一个简单的类Foo
,它扩展了org.eclipse.jetty.server.handler.AbstractHandler
。
同样是一个Bar
org.eclipse.jetty.websocket.api.WebSocketAdapter
胶类:
@SuppressWarnings("serial")
public class Glue extends WebSocketServlet {
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(Bar.class);
}
}
现在我尝试创建一个使用这两者的服务器:
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.setHandler(new Foo());
ServletHolder holder = new ServletHolder("ws-events", Glue.class);
context.addServlet(holder, "/whatever/*");
Server server = new Server(80);
server.setHandler(context);
server.start();
这开始了,当我去localhost时,我看到了Foo应该显示的内容,但是我无法连接到websocket。看起来所有请求都是Foo。
当我删除context.setHandler(new Foo());
行时,它显然不再显示html内容,但我可以连接到websocket。
我希望两者同时工作。
答案 0 :(得分:1)
不要混合处理程序以获取响应和ServletContextHandler。
将Foo
更改为Servlet,为其分配一个合理的url-pattern作为Servlet。
原因是因为Foo
在任何servlet代码之前执行。
使用Handler实现此目的的唯一另一种方法是使Foo
处理程序websocket和HTTP / 1.1升级识别,并在检测到请求用于WebSocket升级时不执行。 (这是一个坏主意!不要这样做!当HTTP / 2上的WebSocket到达时,它不向后兼容!)
另请注意,如果非websocket客户端在同一个url-pattern上请求HTTP内容,则可以使用Glue
类实现doGet()
和服务HTML。
顺便说一句,如果您想要提供静态HTML,请不要在您自己的代码中执行此操作。分配合理的基础资源位置"到ServletContextHandler
并添加DefaultServlet
以提供与其他网址格式不匹配的静态资源。