pre过滤器——Servlet30WrapperFilter

Posted awsl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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等内容。

 

以上是关于pre过滤器——Servlet30WrapperFilter的主要内容,如果未能解决你的问题,请参考以下文章

为啥 java servlet 不是过滤器? [复制]

Servlet 过滤器 url 映射

如何在 Tomcat 上运行的 servlet 过滤器中使用 HttpServletRequest#getParts()?

filter用户例子

什么是泽西过滤器?

Java Servlet 过滤器和其他对象和实体管理器的范围