发布于2022-11-08 22:19 阅读(1151) 评论(0) 点赞(20) 收藏(3)
我们有一个遗留应用程序,它使用嵌入式 Jetty 并通过客户端发出 HTTP 调用提供功能。服务器所需的大部分信息/参数都是由客户端通过 HTTP 标头发送的。我们现在正在使用 Jersey 对 REST API 调用的使用进行原型设计,其中提供相同的参数作为 JSON 输入。要求之一是保持向后兼容性并且不干扰现有功能。
虽然我们能够使用 Jersey 并传入参数,但我们正在寻求以下帮助:
我已经尝试过其他(非常有用的)关于使用包装器/过滤器机制添加自定义标头的帖子,甚至是使用 ContainerRequestFilter 的帖子。以下是我的参考资料:
但是出于安全原因,遗留应用程序有这行代码(在 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
orFilter
链。
Request
由于它在其中执行的无上下文环境的需要,包装核心 Jetty 对象也是不可能的。您无法更改此行为。
如果您正在包装请求并且不仅仅是为了提供自定义请求标头,那么请停止执行您现在正在处理的所有包装和废话。
注意:您停止包装
HttpServletRequest
、HttpServletResponse
或 Servlet 流的那一刻,您就可以使用为 Servlet 3.0 和更新版本引入的功能,例如 AsyncContext 和 Async I/O。在现代使用中不鼓励包装这些组件的技术,因为它限制了您更好地执行 web 应用程序的选择。
您有 2 个选择,都在原地修改请求标头。
如果您选择在发送前修改标题,您可以在 2 个地方执行此操作。
HttpConfiguration.Customizer
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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!