Обернутые запросы действительны только для той же цепочки ServletContext
и Filter
, в которой был создан обернутый запрос, и применяются только к остальной части исполняемой цепочки фильтров с момента создания.
Обернутый запрос никогда не будет применяться к стандартному Jetty Handler
, поскольку он не участвует в цепочке ServletContext
или Filter
.
Также невозможно обернуть основной объект Jetty Request
из-за потребностей среды без контекста, в которой он выполняется. Вы не можете изменить это поведение.
Если вы упаковываете запросы и так далее, просто чтобы предоставить пользовательский заголовок запроса, прекратите делать ALL упаковки и бессмыслицы, с которыми вы сейчас имеете дело.
Примечание. В минуту, когда вы прекратите перенос HttpServletRequest
, HttpServletResponse
или потоков сервлетов, вы сможете использовать функции, представленные в Servlet 3.0 и новее, например AsyncContext и Async I / O. Техника обертывания этих компонентов не рекомендуется в современном использовании, потому что она ограничивает ваши возможности для более эффективных веб-приложений.
У вас есть 2 варианта, оба изменяют заголовки запроса на месте.
- Изменить заголовки запроса перед отправкой.
- Изменить заголовки запроса во время отправки через низкоуровневый обработчик Jetty.
Если вы решите изменить заголовки перед отправкой, есть 2 места, где вы можете сделать это.
- Как
HttpConfiguration.Customizer
- Во время одной из предварительных отправок
HttpChannel.Listener
событий
Если вы решите изменить заголовки во время отправки, то создайте Jetty Handler
, которая изменяет заголовки Request
, и поместите его где-нибудь в начале иерархии вашего обработчика сервера.
Код, который изменяет заголовки запроса, будет делать то же самое, вот пример версии обработчика.
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");
}
}