服务器端定制标头,带嵌入式码头和球衣

RBK:

我们有一个使用嵌入式Jetty的旧版应用程序,并通过客户端进行HTTP调用来提供功能。服务器所需的大多数信息/参数由客户端通过HTTP标头发送。现在,我们使用Jersey提供原型化使用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输入作为标头从REST处理方法发送到现有Jetty处理程序的最佳方法是什么,而又不产生安全问题?我想我可以稍微调整一下基本请求的检查,但是我不确定做到这一点的最佳方法。

乔基姆·埃德菲特(Joakim Erdfelt):

打包的请求仅对创建打包请求所在的链ServletContext请求有效Filter,并且仅适用于从创建之时起正在执行的过滤器链的其余部分。

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

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

如果要包装请求,而不仅仅是提供自定义请求标头,则立即停止处理您正在处理的所有包装和废话。

注意:在停止包装HttpServletRequestHttpServletResponse或Servlet流的那一刻,您将可以使用为Servlet 3.0和更高版本引入的功能,例如AsyncContext和Async I / O。在现代用法中不鼓励使用包装这些组件的技术,因为它限制了您选择性能更好的Web应用程序的选择。

您有2个选择,都可以就地修改Request标头。

  1. 分发前修改Request标头。
  2. 通过低级Jetty处理程序在分发过程中修改Request标头。

如果选择在发送前修改标题,则可以在2个地方执行此操作。

  1. 作为一个 HttpConfiguration.Customizer
  2. 在其中一个调度前HttpChannel.Listener事件中

如果您选择在分发期间修改标头,则创建一个Jetty Handler来修改Request标头,并将其放在服务器处理程序层次结构的早期。

修改Request标头的代码将做同样的事情,这里以Handler版本为例。

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");
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

嵌入式码头服务器发生爆炸

使用嵌入式 tomcat 更改服务器标头

具有服务器端授权的Google Analytics(分析)嵌入式API-Firebase托管

如何配置嵌入式码头服务器记录所有请求?

嵌入式码头:资源文件夹中的服务器html文件

使用嵌入式码头,如何将ServerConnector链接到服务器?

嵌入式码头服务器导致UTF-8字符问题

带嵌入式码头的WebSockets

嵌入式Jetty服务器

服务器端标头重定向是否已缓存?

在服务器端 Web 应用程序中禁用缓存的通用 HTTP 标头

如何使用Spray RestAPI从服务器端获取HTTP请求标头信息

通过HTTP标头使用HTML Picture或服务器端支持WebP?

定制类的服务器端onchange事件

在Eclipse中为嵌入式码头服务器发动战争的推荐方法是什么?

Java中的嵌入式NIO http客户端/服务器

在 Ktor 中使用 Jetty 嵌入式服务器获取客户端证书

在 HTTP/2 中,标头如何在客户端和服务器端保持同步?

Azure云服务嵌入式FTP服务器

带参数的服务器端剑道网格

嵌入式码头与战争爆发,使用带注释的配置

嵌入式与非嵌入式Java服务器

如何找到嵌入式Redis端口并杀死嵌入式Redis服务器

Jetty嵌入式服务器和Spring Security集成

Firebird .NET提供程序和嵌入式服务器3

弹簧启动测试和嵌入式弹性服务器

春季启动:Web.xml和嵌入式服务器jar

在嵌入式设备上安装SSH服务器

使用FastCGI的嵌入式Web服务器