程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

带有嵌入式码头和球衣的服务器端自定义标头

发布于2022-11-08 22:19     阅读(1151)     评论(0)     点赞(20)     收藏(3)


我们有一个遗留应用程序,它使用嵌入式 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 处理程序的最佳方法是什么?我想我可以稍微调整一下基本请求的检查,但我不确定最好的方法。


解决方案


包装请求仅对创建包装请求的相同链有效,ServletContext并且Filter仅适用于从创建时开始执行的过滤器链的其余部分。

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

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

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

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

您有 2 个选择,都在原地修改请求标头。

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

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

  1. 作为一个HttpConfiguration.Customizer
  2. 在发货前HttpChannel.Listener事件之一期间

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

修改 Request headers 的代码都会做同样的事情,这里以 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");
    }
}


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/567743/db019c420f62efd3eb56/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)