簡體   English   中英

帶嵌入式碼頭和球衣的服務器端自定義標頭

[英]Server side custom headers with embedded jetty and jersey

我們有一個舊應用程序,該應用程序使用嵌入式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處理程序的最佳方法是什么,而又不會引起安全問題? 我想我可以稍微調整一下基本請求的檢查,但是我不確定做到這一點的最佳方法。

包裝的請求僅對在其中創建包裝請求的ServletContextFilter鏈有效,並且僅適用於從創建之時起執行的Filter鏈的其余部分。

包裝的請求永遠不會應用於標准的Jetty Handler ,因為它不參與ServletContextFilter鏈。

由於在其中執行的無上下文環境的需求,也無法包裝核心Jetty Request對象。 您無法更改此行為。

如果要包裝請求,而不僅僅是提供自定義請求標頭,則立即停止處理您正在處理的所有包裝和廢話。

注意:在停止包裝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");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM