Jetty 请求属性未跨服务传播

Jetty Request attributes not propagated across services

服务 A 使用 AsyncProxyServlet 将请求转发到服务 2,但是服务 A 在请求中设置的属性在到达服务 B 后在请求中不可用。servlet 请求属性在 HTTP 调用中不是持久的吗?有人可以帮助我了解发生了什么吗?

public class ForwardServlet extends AsyncProxyServlet
{
  //Service A
...
@Override
  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  {
...
request.setAttribute("FOO", "BAR"); // This attribute is missing in Service B
    super.service(request, response);// Send to service B
}
}

Servlet 请求属性是 Servlet 规范的一部分,是一种在同一 Servlet 容器内跨单个调度链保存值的方法。

这些值不作为任何 HTTP 协议规范的一部分存在,并且不能通过新的 HTTP 请求发送。

servlet 术语中的调度意味着...

  1. 传入的 HTTP 请求已被解析
  2. 已创建 HttpServletRequest object
  3. 到目的地 Servlet 的调用链已根据 FilterServlet url-patterns
  4. 的组合确定
  5. 调度发生在链中的第一个Filter
  6. 每个过滤器和最终目标 servlet 可以add/change请求属性
  7. 每个过滤器或 servlet 也可以获得 RequestDispatcher.forward(req, resp).include(req, resp) 相同的调度到同一 Servlet 容器上的新位置。

如果您的服务 B 在同一个 Servlet 容器上,请使用 RequestDispatcher 并且您的 Request 属性将随之而来。

如果您的服务 B 在不同的服务器上,那么您需要弄清楚如何使用 HTTP 协议(​​可能作为请求 headers?)或在内部将这些属性传输到目标服务器您的请求 body 内容(作为 JSON 值?)