动态过滤



 1.what——过滤器是一个中间组件,用于拦截并过滤源数据和目标数据之间的消息;驻留在容器内;过滤器对浏览器和服务器都是透明的。

2.原理——容器收到对资源的请求时,先判断是否资源与过滤器绑定(映射)——>过滤处理

     

       2.1:过滤器处理请求后,自己相应回网页,而不传递给资源。

       2.2:过滤器处理请求时,将请求的资源更改。

       2.3:经过过滤器链得到资源,响应信息过滤否均可。

3.过滤器的应用

     3.1:认证(防止越权)

     3.2:登录和审核()

     3.3:图片格式转换

     3.4:数据压缩

     3.5:加密

     3.6:令牌过滤(确保唯一)

4.过滤器在程序中的使用

     4.1:编码——实现接口filter和其3个方法。

     4.2:编译

     4.3:部署——web.xml中设置filter和filter-mapping

          4.3.1:<filter>

                  *filter-name——唯一

                  *filter-class

                  *init-param——设置FilterConfig的键和值;任意个

          4.3.2:<filter-mapping>

                  *filter-name

                  *url-pattern(其它映射)—d(都要执行该过滤)—>servlet-name(精确匹配)

                  *需要过滤操作的请求方式——REQUEST、INCLUDE、FORWARD()、ERROR(异常方式)

     4.4:运行

5.API

     5.0:HttpServletRequestWrapper

     5.1:HttpServletResponseWrapper

     5.2:ServletResponseWrapper

     5.3:ServletRequestWrapper

     5.4:filterConfig

        5.4.1:getFilterName()——获得过滤器名

        5.4.2:getInitParameter(String)——获得过滤器中参数的值

        5.4.3:getInitParameterNames(String)——获得过滤器中参数的键

        5.4.4:getServletContext()——与其它组件(Servlet/jsp)共享filter参数

     5.5:Filter

        5.5.1:initial(FilterConfig)——容器仅调用一次,未执行完以前容器不会转发请求到该过滤器。用于设置filterconfig

        5.5.2:doFilter(ServletRequest,ServletResponse,FilterChain)——实例化过滤操作;通过FilterChain的doFilter()方法将请求传给下一个Filter或资源;注意参数转型。

        5.5.3:destroy()

     5.6:FilterChain

        5.6.1:doFilter(ServletRequest,ServletResponse)——将控制权传给链中的下一个组件(filter或servlet)

        5.6.2:过滤顺序——第一批为url-pattern匹配的过滤器,第二批为servlet-name匹配的过滤器;同批次按filter-mapping顺序执行。

   

### 使用 Jackson 实现动态过滤 为了实现 Jackson 的动态过滤功能,可以采用 `@JsonFilter` 注解配合自定义的 Mixin 类以及 ObjectMapper 来完成这一目标。具体来说,在类上标注 `@JsonFilter("filterName")` 可以指定用于该对象类型的过滤器名称[^1]。 对于每一个希望应用动态过滤逻辑的对象模型,都需要声明相应的 `@JsonFilter` 属性: ```java @Data @JsonFilter("car") static class Car { private String make; private int year; } ``` 接着创建一个工具函数用来设置哪些字段应该被包含或排除在外。此过程涉及到了通过反射机制向特定类添加混入(Mixin),从而影响其序列化行为[^2]: ```java public static void filter(Class<?> clazz, String include, String exclude) { if (clazz == null || objectMapper == null) return; SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept(exclude != null ? exclude.split(",") : new String[]{}); FilterProvider filters = new SimpleFilterProvider().addFilter(clazz.getSimpleName(), theFilter); objectMapper.setFilters(filters); if (include != null && !"".equals(include.trim())) { jacksonFilter.include(clazz, include.split(",")); } if (exclude != null && !"".equals(exclude.trim())) { jacksonFilter.filter(clazz, exclude.split(",")); } objectMapper.addMixIn(clazz, jacksonFilter.getClass()); } ``` 上述代码片段展示了如何利用 `SimpleBeanPropertyFilter` 和 `SimpleFilterProvider` 对象来构建并注册新的过滤规则给定的目标类。这里需要注意的是,当指定了要包含(`include`) 或者忽略 (`exclude`) 的字段列表时,这些参数会被解析成字符串数组传递给对应的 setter 方法。 最后一步是在实际调用 JSON 序列化之前调用前面提到过的 `filter()` 函数,并传入适当参数控制输出内容: ```java Car myCar = new Car(); myCar.setMake("Toyota"); myCar.setYear(2023); // 假设只想要 'make' 字段出现在最终的结果里 filter(Car.class, "make", ""); String jsonString = objectMapper.writeValueAsString(myCar); System.out.println(jsonString); // 输出 {"make":"Toyota"} ``` 这样就完成了整个流程——即实现了基于 Jackson 的 Java Bean 动态字段过滤方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值