在CustomAbstracthandler中,修改Httpfield在jetty server 11版本不工作.<



从客户端获取头Connection: close, upgrade,所以我试图将连接头从connection: close, upgrade更改为connection: Upgrade

我在CustomAbstractHandler中修改了httpfield,但在Jetty 11版本中不工作。

CustomAbstractHandler.Java:

import java.io.IOException;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class CustomAbstractHandler extends AbstractHandler {
private static final Logger LOG = LoggerFactory.getLogger(CustomAbstractHandler.class);
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
HttpFields.Mutable replacement = HttpFields.build(baseRequest.getHttpFields()).put("Connection", "Upgrade");
baseRequest.setHttpFields(replacement);
LOG.info("" + baseRequest.getHttpFields());
baseRequest.setHandled(true);
}
}

在主类中配置server.setHandler()处理程序

import java.util.EnumSet;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
import jakarta.servlet.DispatcherType;
public class WebSocketServer {
private static Server server;
public static void main(String args[]) throws Exception {
server = new Server();
server.setStopTimeout(100);
ServerConnector connector = new ServerConnector(server);
connector.setIdleTimeout(1000 * 60 * 60);
connector.setPort(56667);
connector.setAcceptedTcpNoDelay(true);
connector.setAccepting(true);
connector.join(100);
connector.setAcceptedReceiveBufferSize(1234567889);
connector.getConnectedEndPoints();
server.addConnector(connector);
ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/shop");
FilterHolder filterHolder = contextHandler.addFilter(websocketcreator.class, "/*",
EnumSet.of(DispatcherType.REQUEST));
filterHolder.setAsyncSupported(true);
contextHandler.getSessionHandler().setMaxInactiveInterval(5);
server.setHandler(new CustomAbstractHandler());
contextHandler.addServlet(WebSocketServerServlet.class, "/web-socket/");
JettyWebSocketServletContainerInitializer.configure(contextHandler, null);
server.setHandler(contextHandler);
server.start();
server.dump(System.err);
server.join();
}

代码有什么问题吗?

您的代码正在撤消您的努力。

server.setHandler(new CustomAbstractHandler());
...(snip)...
server.setHandler(contextHandler);

contextHandler代替CustomAbstractHandler

server.setHandler(Handler)是一个Handler,看起来你想要多个Handlers

HandlerList代替。

// this is a org.eclipse.jetty.server.handler.HandlerList
HandlerList handlers = new HandlerList();
handlers.add(new CustomAbstractHandler());
handlers.add(contextHandler);
server.setHandler(handlers);

有关Jetty中Handler树的更多细节,请参阅过去的回答。

  • https://stackoverflow.com/a/39217143/775715
  • https://stackoverflow.com/a/57716374/775715

最新更新