【问题标题】:In CustomAbstracthandler, Modify Httpfield is not working in jetty server 11 version在 CustomAbstracthandler 中,Modify Httpfield 在 jetty server 11 版本中不起作用
【发布时间】: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


【解决方案1】:

您的代码正在破坏您的努力。

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

CustomAbstractHandler 替换为contextHandler

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 中处理程序树的更多详细信息,请参阅过去的答案。

【讨论】:

  • 我做了更改,但没有工作HandlerList handlers = new HandlerList(new CustomAbstractHandler(),contextHandler); server.setHandler(handlers);
  • 您希望CustomAbstractHandler 中的请求字段更改传播到contextHandler 吗?如果是这样,请删除baseRequest.setHandled(true);(这在过去的答案中提到过)
  • 如何在 Request 类或 HttpChannel 类的 Request 条目中更改传入的标头值
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多