【发布时间】:2021-08-19 13:57:28
【问题描述】:
从客户端获取标头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()中的Handler
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();
}
代码有什么问题吗?
【问题讨论】:
-
需要更多信息。你是如何使用这个处理程序的?它在您的处理程序树中的什么位置?这可能只是因为此处理程序未在您的请求处理中的正确时间或地点执行。
-
@JoakimErdfelt 添加了配置类
标签: websocket java-11 embedded-jetty java-websocket jetty-10