Jetty websockets 和 abstracthandler
Jetty websockets and abstracthandler
我正在尝试让普通的 AbstractHandler 和 WebSocketAdapter 同时工作。
码头版本:码头-9.4.8.v20171121,
我有一个简单的 class Foo
扩展 org.eclipse.jetty.server.handler.AbstractHandler
.
还有一个扩展 org.eclipse.jetty.websocket.api.WebSocketAdapter
的 class Bar
胶-class:
@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();
这开始了,当我转到本地主机时,我看到了 Foo 应该显示的内容,但我无法连接到 websocket。看起来所有请求都转到了 Foo。
当我删除 context.setHandler(new Foo());
行时,它显然不再显示 html-content,但我可以连接到 websocket。
我希望两者同时工作。
不要混合使用响应处理程序和 ServletContextHandler。
将 Foo
更改为 Servlet,为其分配合理的 url-pattern 作为 Servlet。
原因是因为您的 Foo
在任何 servlet 代码之前执行。
使用处理程序完成此操作的唯一其他方法是让您的 Foo
处理程序 websocket 和 HTTP/1.1 升级感知并且在检测到请求用于 WebSocket 升级时不执行。 (这是个坏主意!不要这样做!当 WebSocket over HTTP/2 到来时它不向后兼容!)
另请注意,如果非 websocket 客户端在同一 url-模式。
顺便说一句,如果您想要提供静态 html,请不要在您自己的代码中这样做。为您的 ServletContextHandler
分配一个合理的 "Base Resource Location" 并添加一个 DefaultServlet
以提供与另一个 url 模式不匹配的静态资源。
查看之前的回答:
我正在尝试让普通的 AbstractHandler 和 WebSocketAdapter 同时工作。
码头版本:码头-9.4.8.v20171121,
我有一个简单的 class Foo
扩展 org.eclipse.jetty.server.handler.AbstractHandler
.
还有一个扩展 org.eclipse.jetty.websocket.api.WebSocketAdapter
Bar
胶-class:
@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();
这开始了,当我转到本地主机时,我看到了 Foo 应该显示的内容,但我无法连接到 websocket。看起来所有请求都转到了 Foo。
当我删除 context.setHandler(new Foo());
行时,它显然不再显示 html-content,但我可以连接到 websocket。
我希望两者同时工作。
不要混合使用响应处理程序和 ServletContextHandler。
将 Foo
更改为 Servlet,为其分配合理的 url-pattern 作为 Servlet。
原因是因为您的 Foo
在任何 servlet 代码之前执行。
使用处理程序完成此操作的唯一其他方法是让您的 Foo
处理程序 websocket 和 HTTP/1.1 升级感知并且在检测到请求用于 WebSocket 升级时不执行。 (这是个坏主意!不要这样做!当 WebSocket over HTTP/2 到来时它不向后兼容!)
另请注意,如果非 websocket 客户端在同一 url-模式。
顺便说一句,如果您想要提供静态 html,请不要在您自己的代码中这样做。为您的 ServletContextHandler
分配一个合理的 "Base Resource Location" 并添加一个 DefaultServlet
以提供与另一个 url 模式不匹配的静态资源。
查看之前的回答: