[英]Server side custom headers with embedded jetty and jersey
我們有一個舊應用程序,該應用程序使用嵌入式Jetty並通過客戶端進行HTTP調用來提供功能。 服務器所需的大多數信息/參數由客戶端通過HTTP標頭發送。 現在,我們使用Jersey來原型化REST API調用的使用,其中提供與JSON輸入相同的參數。 要求之一是保持向后兼容性,並且不干擾現有功能。
盡管我們能夠使用Jersey並傳遞參數,但我們在以下方面尋求幫助:
我已經嘗試了其他(非常有幫助)的帖子,內容涉及使用包裝器/過濾器機制添加自定義標頭,甚至是一個使用ContainterRequestFilter的標頭。 以下是我的參考資料:
但是出於安全原因,舊版應用程序具有以下代碼行(在Jetty文檔中推薦),該代碼行使用基本請求而不是包裝請求:
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
鏈有效,並且僅適用於從創建之時起執行的Filter鏈的其余部分。
包裝的請求永遠不會應用於標准的Jetty Handler
,因為它不參與ServletContext
或Filter
鏈。
由於在其中執行的無上下文環境的需求,也無法包裝核心Jetty Request
對象。 您無法更改此行為。
如果要包裝請求,而不僅僅是提供自定義請求標頭,則立即停止處理您正在處理的所有包裝和廢話。
注意:在停止包裝
HttpServletRequest
,HttpServletResponse
或Servlet流的那一刻,您將可以使用為Servlet 3.0和更高版本引入的功能,例如AsyncContext和Async I / O。 在現代用法中不鼓勵使用包裝這些組件的技術,因為它限制了您選擇性能更好的Web應用程序的選擇。
您有2個選擇,都可以就地修改Request標頭。
如果選擇在發送前修改標頭,則可以在2個地方執行此操作。
HttpConfiguration.Customizer
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.