Jetty websockets和abstracthandler

时间:2018-04-24 17:46:49

标签: jetty java-websocket

我正在尝试让普通的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。

我希望两者同时工作。

1 个答案:

答案 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以提供与其他网址格式不匹配的静态资源。

请参阅先前的答案:https://stackoverflow.com/a/20223103/775715