如何将自定义 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 报告给服务器级别错误处理程序.
我正在使用 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 报告给服务器级别错误处理程序.