如何将自定义 header 添加到服务器上的即将到来的请求中?

How to add a custom header into coming request on server?

我正在使用 Jetty 11 服务器,它有一个名为 getObject() 的 GET 方法。

当我在服务器上收到一个请求时,我想添加一个自定义 header 来为该请求创建一个唯一标识。所以我试图将使用 UUID 获得的值添加到 header.

之类的东西

我尝试使用 -

在 header 本身中进行伪搜索
        final String requestId;
        if (!StringUtil.isEmpty(request.getHeader("request-id")) && !StringUtil.isEmpty(request.getHeader("request-id"))) {
            requestId = request.getHeader(request.getHeader("request-id"));
        }
        else {
            requestId = UUID.randomUUID().toString().toUpperCase(); //.replace("-", "");
        }
        request.setAttribute("Request-ID", requestId);
        System.out.println("requestId - " + requestId);

但这似乎没有添加到请求的 header 中。

我的最终目标是在我的请求切换环境时用这个 x-request-id 将这个请求转发到服务器之外。收到回复后,我想稍后对此请求进行一些查找。

我的方法是这样的-

public void handle(String target, Request jettyReq, HttpServletRequest request, HttpServletResponse response) {

        // Redirect API control based on HTTP method type
        if (request.getMethod().equals(constGetRequest)) {
            doGetObject(jettyReq, request, response);
        }
        jettyReq.setHandled(true);
    }

如何使用码头中的 HttpServletRequest 请求实现此目的?

由于您使用的是嵌入式 Jetty,因此请使用内置的 org.eclipse.jetty.server.HttpChannel.Listener

您将有权访问具有该请求的 HTTP 字段的原始内部 Jetty org.eclipse.jetty.server.Request 对象。

要使用它,您需要创建一个实例 HttpChannel.Listener,并将其作为 bean 添加到您的连接器中。

MyChannelListener channelListener = new MyChannelListener();
connector.addBean(channelListener);

侦听器公开了许多事件,您可能希望在 void onRequestBegin(Request request) 事件期间设置 X-Request-ID

如果使用 Jetty 9.x 你可以使用下面的...

@Override
public void onRequestBegin(Request request)
{
    request.getHttpFields().put("X-Request-ID", UUID.randomUUID().toString());
}

如果使用 Jetty 10.0.0+(包括 Jetty 11),request.getHttpFields() 是一个不可变对象。你只需要故意把它拉出来,修改它,然后替换它,就像这样..

@Override
public void onRequestBegin(Request request)
{
    HttpFields.Mutable replacement = HttpFields.build(request.getHttpFields())
        .put("X-Request-ID", UUID.randomUUID().toString().toUpperCase());
    request.setHttpFields(replacement);
}

阅读 HttpChannel.Listener 上的 javadoc 并选择其他可能适合您需要的内容。

然后该请求的所有其他访问,无论是 Jetty 的内部组件、web 应用程序、特定的 servlet、过滤器、转发、包含、servlet 规范中的错误处理、servlet 上下文之外的错误处理等都可以都看到了

您不会在此看到的唯一类型的请求是请求行 and/or 低级别 Header/Field 解析步骤失败的请求,这些请求将作为 BadMessageExceptions 报告给服务器级别错误处理程序.