博主上次分析完cas客户端源码后,发现了其实就是一个过滤器模式,对请求以及session一直做校验,每个过滤器都有各自的工作,互不影响耦合性低,所以就模仿其源码,做了一次过滤器模式的学习,图示如下
其实过滤器整个类可以不用,只不过在jetty中,过滤器整合类不知有过滤器还有其他属性,比如config配置等。如下:参考即可
好了,我们来看一下过滤器模式,一个过滤器接口定义方法,多个实现类去实现具体操作过滤,一个整合类增加一个过滤器,一个过滤器链表去实现以节点类型,依次进行过滤
该接口进行定义方法:
代码语言:javascript复制 1 import java.io.IOException;
2 import java.util.List;
3
4 /**
5 * @title: DemoFilter
6 * @Author junyu
12 * @Version 1.0
13 */
14 public interface DemoFilter{
15
16 void doFilter(List list, DemoFilterChain demoFilterChain);
17 }
多个实现类:
这段代码实现了一个简单的过滤器功能。当调用 AFilterImpl 类的 doFilter 方法时,它会首先检查传入的列表是否为空,如果为空则输出一条消息并直接返回,否则将列表传递给 demoFilterChain 对象进行进一步的过滤处理。
代码语言:javascript复制 1 import java.util.List;
2
3 /**
4 * @title: AFilterImpl
5 * @Author junyu
11 * @Version 1.0
12 */
13 public class AFilterImpl implements DemoFilter{
14
15 @Override
16 public void doFilter(List list, DemoFilterChain demoFilterChain) {
17 System.out.println("AFilterImpl is beginning");
18 if (list.isEmpty()) {
19 System.out.println("该列表为空,无需过滤!");
20 return;
21 }
22 demoFilterChain.doFilter(list);
23 }
24 }
BFilterImpl 类的作用是实现 DemoFilter 接口中的过滤方法 doFilter,在方法中打印输出列表的内容,并将列表传递给过滤器链中的下一个过滤器进行进一步处理。
代码语言:javascript复制 1 import java.util.List;
2
3 /**
4 * @title: BFilterImpl
5 * @Author junyu
11 * @Version 1.0
12 */
13 public class BFilterImpl implements DemoFilter{
14
15 @Override
16 public void doFilter(List list, DemoFilterChain demoFilterChain) {
17 System.out.println("BFilterImpl is beginning");
18 System.out.println("list`s body:");
19 list.stream().forEach(one ->{
20 System.out.print( one ",");
21 });
22 demoFilterChain.doFilter(list);
23 }
24 }
一个整合类在这里,FilterHolder 类专门用于持有 DemoFilter 对象,并提供了标准的访问接口,以便其他代码可以获取或者更新这个 DemoFilter 对象。
代码语言:javascript复制 1 **
2 * @title: FilterHolder
3 * @Author junyu
9 * @Version 1.0
10 */
11 public class FilterHolder{
12 private transient DemoFilter filter;
13
14 public DemoFilter getFilter() {
15 return filter;
16 }
17
18 public void setFilter(DemoFilter filter) {
19 this.filter = filter;
20 }
21 }
一个过滤器链表,每个 DemoFilterChain 对象包含一个 FilterHolder 对象来保存一个过滤器,并且通过 next 字段链接到下一个 DemoFilterChain 对象,从而形成一个链表结构。构造函数用递归的方式创建了整个链表,方法 doFilter 用于按顺序执行每个过滤器的 doFilter 方法,实现过滤器链的功能。
代码语言:javascript复制 1 import java.util.List;
2
3 /**
4 * @title: DemoFilterChain
11 * @Version 1.0
12 */
13 public class DemoFilterChain{
14 FilterHolder filterHolder;
15 DemoFilterChain next;
16
17 DemoFilterChain(List<DemoFilter> list){
18 if (list.isEmpty()) {
19 return;
20 }
21 filterHolder = new FilterHolder();
22 filterHolder.setFilter(list.get(0));
23 list.remove(0);
24 next = new DemoFilterChain(list);
25 }
26
27 public void doFilter(List list) {
28 if (filterHolder != null) {
29 DemoFilter filter = filterHolder.getFilter();
30 filter.doFilter(list,next);
31 }
32 }
33 }
进行测试
代码语言:javascript复制 1 import java.util.ArrayList;
2 import java.util.List;
3
4 /**
5 * @title: TestMain
6 * @Author junyu
12 * @Version 1.0
13 */
14 public class TestMain {
15
16 public static void main(String[] args) {
17 List<DemoFilter> list = new ArrayList<>();
18 AFilterImpl aFilter = new AFilterImpl();
19 BFilterImpl bFilter = new BFilterImpl();
20 list.add(aFilter);
21 list.add(bFilter);
22 DemoFilterChain demoFilterChain = new DemoFilterChain(list);
23
24 List<String> filterList = new ArrayList<>();
25 filterList.add("this is filter string");
26 filterList.add("this is filter end");
27
28 demoFilterChain.doFilter(filterList);
29
30 }
31 }
输出结果:
AFilterImpl is beginning
BFilterImpl is beginning
list`s body:
this is filter string,this is filter end,
我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!