我们有一个使用嵌入式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
,并且仅适用于从创建之时起正在执行的过滤器链的其余部分。
包装的请求永远不会应用于标准的Jetty Handler
,因为它不参与ServletContext
或Filter
链。
Request
由于在其中执行的无上下文环境的需求,也无法包装核心Jetty 对象。您无法更改此行为。
如果要包装请求,而不仅仅是提供自定义请求标头,则立即停止处理您正在处理的所有包装和废话。
注意:在停止包装
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");
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句