gpt4 book ai didi

java - 如何在 Jetty 中设置多个处理程序并且在启动过程中不出现错误

转载 作者:行者123 更新时间:2023-11-30 01:59:15 24 4
gpt4 key购买 nike

我有一些服务器代码,如下所示:

private WebAppContext getAspireWebAppContext() {
WebAppContext root = new WebAppContext();
root.setWar(config().<String>property("war.file"));
root.setContextPath("/");
return root;
}

private Server startWebApp(int port) {
try {
server.setConnectors(createConnectors(port));
ServletContextHandler context = getAspireWebAppContext();
server.setHandler(context);

// Ensure that a websocket always has a HttpSession
context.addFilter(HttpSessionForWebsocketFilter.class,"/ws/*",null);
// add websocket support
ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext( context );
wscontainer.addEndpoint(EngineSocket.class);
wscontainer.addEndpoint(WorkbenchSocket.class);

server.start();
} ....
}

我想使用HandlerList,这样我就可以添加RewriteHandler。所以我尝试改变它:

HandlerList handlers = new HandlerList();

server.setConnectors(createConnectors(port));
ServletContextHandler context = getAspireWebAppContext();
// server.setHandler(context);
handlers.addHandler(context);

// Ensure that a websocket always has a HttpSession
context.addFilter(HttpSessionForWebsocketFilter.class,"/ws/*",null);
// add websocket support
ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext( context );
wscontainer.addEndpoint(EngineSocket.class);
wscontainer.addEndpoint(WorkbenchSocket.class);

// RewriteHandler stuff
// handlers.addHandler(rewrite);

server.setHandler(handlers);
server.start();

即使在我添加更多处理程序之前,这也会导致 WebSocketServerContainerInitializer.configureContext(context) 行出现 null 异常:

Caused by: java.lang.NullPointerException at org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext(WebSocketServerContainerInitializer.java:148)

我在某处读到 context.setServer(server); 可能有帮助,但无济于事。我究竟做错了什么?谢谢

最佳答案

首先将HandlerList添加到服务器。

Server server = new Server();
HandlerList handlers = new HandlerList();
server.setHandler(handlers);

ServletContextHandler context = getAspireWebAppContext();
handlers.addHandler(context);

ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext( context );
wscontainer.addEndpoint(EngineSocket.class);
wscontainer.addEndpoint(WorkbenchSocket.class);

// RewriteHandler stuff
handlers.addHandler(rewrite);

server.start();

但最终,此 NPE 是一个错误,内部尝试从属于您的 ServletContextHandlerServer 获取通用 HttpClient

打开为https://github.com/eclipse/jetty.project/issues/3139

还值得注意的是,您应该知道您无法可靠地将过滤器应用于 WebSocket 连接。

通过 JSR356(您选择使用的 API)进行的 WebSocket 升级旨在在 Filter 链之外进行升级。这是因为 Filter 可以修改请求/响应、更改响应的提交状态、包装输入流、包装输出流等。所有这些在 WebSocket 升级期间都是被禁止的。虽然您的过滤器可能在某些时候有效,但它不会 100% 有效。并且此类操作的 Set-Cookie header 也不能保证在响应中发回。

如果您切换到 Jetty Native WebSocket API,您可以控制升级发生的位置(同样禁止的操作也适用)。从 WebSocketServlet 扩展,或从 WebSocketUpgradeFilter 扩展并应用您自己的逻辑,或者更好的是,提供您自己的 WebSocketCreator 来执行您需要的操作。

关于java - 如何在 Jetty 中设置多个处理程序并且在启动过程中不出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53448881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com