pre过滤器——Servlet30WrapperFilter

Servlet30WrapperFilter

Servlet30WrapperFilter主要是将原始请求进行包装,将原始的HttpServletRequest请求包装成Servlet30RequestWrapper类型的。

/***/
public class Servlet30WrapperFilter extends ZuulFilter {
    
private Field requestField = null; /***/ public Servlet30WrapperFilter() { /**ReflectionUtils.findField:在HttpServletRequestWrapper中查询字段名为req,字段类型为HttpServletRequest的字段属性*/ this.requestField = ReflectionUtils.findField(HttpServletRequestWrapper.class, "req", HttpServletRequest.class); Assert.notNull(this.requestField, "HttpServletRequestWrapper.req field not found"); this.requestField.setAccessible(true); } /**获取HttpServletRequest类型的字段属性req*/ protected Field getRequestField() { return this.requestField; } public String filterType() { return "pre"; } public int filterOrder() { return -2; } public boolean shouldFilter() { return true; } /***/ public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); /**判断请求是否是HttpServletRequestWrapper类型的;原始的请求一般不是它的子类
      *ReflectionUtils.getField:在指定对象上得到指定的属性值
      *这里是从request中取得req属性的值;其中req字段的类型是HttpServletRequest
      *这里的实际作用就是将HttpServletRequestWrapper类型的请求转换成Servlet30RequestWrapper的类型;简单而言就是换了层外壳
      */
if (request instanceof HttpServletRequestWrapper) { request = (HttpServletRequest)ReflectionUtils.getField(this.requestField, request); ctx.setRequest(new Servlet30RequestWrapper(request)); } else if (RequestUtils.isDispatcherServletRequest()) {
      /**
       *判断请求request是否是从DispatcherServlet进来的,是的话就包装它
       *
       */
ctx.setRequest(new Servlet30RequestWrapper(request)); } return null; } }

 本过滤器实际就是将原始请求包装成Servlet30RequestWrapper类型的,扩展其功能。

包装后的效果:等同于HttpServletRequestWrapper包装。

 1 class Servlet30RequestWrapper extends HttpServletRequestWrapper {
 2     private HttpServletRequest request;
 3 
 4     Servlet30RequestWrapper(HttpServletRequest request) {
 5         super(request);
 6         this.request = request;
 7     }
 8 
 9     public HttpServletRequest getRequest() {
10         return this.request;
11     }
12 }
Servlet30RequestWrapper

扩展的(部分)内容有:

   /***在HttpServletReuqestWrapper中*/
  private static final HashMap<String, String[]> EMPTY_MAP = new HashMap();
  private byte[] contentData = null;
    private HashMap<String, String[]> parameters = null;
    private long bodyBufferingTimeNs = 0L;

  从上述属性可以看出,经过包装之后可以修改请求的一些参数,以及contentData等内容。

 

转载于:https://www.cnblogs.com/AWSL/p/10631229.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值