gpt4 book ai didi

java - 带有嵌入式 jetty 和 Jersey 的服务器端自定义 header

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:30 25 4
gpt4 key购买 nike

我们有一个旧应用程序,它使用嵌入式 Jetty 并通过客户端进行 HTTP 调用提供功能。服务器所需的大部分信息/参数都是由客户端通过 HTTP header 发送的。我们现在正在使用 Jersey 来原型(prototype)化 REST API 调用的使用,其中提供相同的参数作为 JSON 输入。要求之一是保持向后兼容性并且不干扰现有功能。

虽然我们能够使用 Jersey 并传递参数,但我们正在寻求以下方面的帮助:

Request base_request = request instanceof Request ? (Request)request : HttpConnection.getCurrentConnection().getHttpChannel().getRequest();
Response base_response = response instanceof Response ? (Response)response : HttpConnection.getCurrentConnection().getHttpChannel().getResponse();

这实际上并没有使用我发送的 HttpServletRequestWrapper 对象。由于这行代码查找 org.eclipse.jetty.server.Request 对象,因此我尝试围绕该对象创建一个包装器,如下所示,但这不起作用,因为该实例的大部分内容似乎为 null,而且它不会提供 Request 对象将提供的其余方法。

class MyRequestWrapper extends Request
{
public MyRequestWrapper(HttpServletRequest request)
{
super( ((Request)request).getHttpChannel(), ((Request)request).getHttpInput());
}

@Override
public String getHeader(String name)
{
if(name.equalsIgnoreCase("X-My-Test"))
{
return "MyName";
}
return super.getHeader(name);
}
}

将 JSON 输入作为 header 从 REST 处理方法发送到现有 Jetty 处理程序而不产生安全问题的最佳方法是什么?我想我可以稍微调整一下基本请求的检查,但我不确定最好的方法。

最佳答案

包装的请求仅对创建包装请求的同一个 ServletContextFilter 链有效,并且仅适用于从创建时间点开始执行的 Filter 链的其余部分。

包装的请求永远不会应用于标准 Jetty Handler,因为它不参与 ServletContextFilter 链。

由于核心 Jetty Request 对象在其中执行的无上下文环境的需要,也不可能包装它。您无法更改此行为。

如果您正在包装请求并且不仅仅是为了提供自定义请求 header ,那么请停止执行您现在正在处理的所有包装和废话。

Note: The minute you stop wrapping HttpServletRequest, HttpServletResponse, or the Servlet streams is the minute you will have the ability to use features introduced for Servlet 3.0 and newer, such as AsyncContext and Async I/O. The technique of wrapping these components is discouraged in modern usage because it limits your options for better performing webapps.

您有 2 个选择,都就地修改请求 header 。

  1. 在分派(dispatch)之前修改请求 header 。
  2. 在调度期间通过低级 Jetty 处理程序修改请求 header 。

如果您选择在发送前修改 header ,则可以在 2 个位置执行此操作。

  1. 作为 HttpConfiguration.Customizer
  2. 在预 dispatch 期间之一 HttpChannel.Listener Activity

如果您选择在调度期间修改 header ,则创建一个 Jetty Handler修改 Request header ,并将其放在服务器处理程序层次结构的早期位置。

修改请求头的代码都会做同样的事情,这里以处理程序版本为例。

package jetty.demo;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.HandlerWrapper;

public class ModifyRequestHeadersHandler extends AbstractHandler
{
@Override
public void handle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
// As fully fleshed out field
final HttpField X_MY_TEST = new HttpField("X-My-Test", "MyName");
baseRequest.getHttpFields().put(X_MY_TEST);

// As predefined header and custom value
baseRequest.getHttpFields().put(HttpHeader.X_POWERED_BY,
"ModifiedRequestHeadersHandler");

// As string header and string value
baseRequest.getHttpFields().put("X-Foo-Test", "MyFooName");
}
}

关于java - 带有嵌入式 jetty 和 Jersey 的服务器端自定义 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56449207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com