简介

image.png

首先任务会先到消息处理器.
消息处理器调用doFilter方法,也就是处理链中的doFilter.
处理链的doFilter是循环调用它内部的一个个处理类.
处理类的doFilter是详细处理

image.png

image.png

接口

规范实现类

  1. public interface Filter {
  2. String doFilter(String str);
  3. }

具体处理类

HtmlFilter

  1. public class HtmlFilter implements Filter {
  2. @Override
  3. public String doFilter(String str) {
  4. //处理特殊字符
  5. String replace = str.replace('<', '[')
  6. .replace('>', ']');
  7. return replace;
  8. }
  9. }

SesitiveFilte

  1. public class SesitiveFilte implements Filter {
  2. @Override
  3. public String doFilter(String str) {
  4. //处理敏感字
  5. String r = str.replace("敏感", "**")
  6. .replace("不好", "**");
  7. return r;
  8. }
  9. }

FaceFilter

  1. public class FaceFilter implements Filter {
  2. @Override
  3. public String doFilter(String str) {
  4. //处理特殊字符
  5. String replace = str.replace(':', '*');
  6. return replace;
  7. }
  8. }

责任链

  1. public class FilterChain implements Filter {
  2. List<Filter> filters = new ArrayList<Filter>();
  3. //把责任添加进去
  4. public FilterChain addFilter(Filter f) {
  5. this.filters.add(f);
  6. return this;
  7. }
  8. @Override
  9. public String doFilter(String str) {
  10. String r = str;
  11. //挨个调用每个filter的处理方法,一直在里面循环直到循环结束
  12. for (Filter filter : filters) {
  13. r = filter.doFilter(r);
  14. }
  15. return r;
  16. }
  17. }

消息处理程序

这个是启动责任链的程序

  1. @Data
  2. public class MsgProcessor {
  3. //保存消息
  4. private String msg;
  5. //保存责任链
  6. FilterChain fc;
  7. public String process() {
  8. return fc.doFilter(msg);
  9. }
  10. }

主程序

  1. String msg = "大家好:), <script>: 敏感词, 不好";
  2. //初始化消息处理器
  3. MsgProcessor mp = new MsgProcessor();
  4. //把要处理的消息添加进去
  5. mp.setMsg(msg);
  6. //初始化,责任链
  7. FilterChain fc = new FilterChain();
  8. //添加过滤器,链式调用
  9. fc.addFilter(new HtmlFilter()).addFilter(new SesitiveFilte());
  10. //添加子链,这个子责任链是挂到主责任链上面的
  11. FilterChain fc2 = new FilterChain();
  12. fc2.addFilter(new FaceFilter());
  13. //把子链添加到责任链中
  14. fc.addFilter(fc2);
  15. //把责任链添加到消息处理器中
  16. mp.setFc(fc);
  17. //进行消息处理
  18. String result = mp.process();
  19. System.out.println(result);

web中的责任链

image.png

Filter接口

  1. public interface Filter {
  2. //给他请求类和响应类,他来调用责任链处理里面的
  3. void doFilter(Request request, Response response, FilterChain filterChain);
  4. }

具体处理

FaceFilter

  1. public class FaceFilter implements Filter {
  2. @Override
  3. public void doFilter(Request request, Response response, FilterChain filterChain) {
  4. //请求处理特殊字符
  5. String str = request.getRequestStr()
  6. .replace(':', '*');
  7. request.setRequestStr(str);
  8. filterChain.doFilter(request, response, filterChain);
  9. //响应处理的
  10. String responseMsg = response.getResponseStr() + "---FaceFilter";
  11. response.setResponseStr(responseMsg);
  12. }
  13. }

HtmlFilter

  1. public class HtmlFilter implements Filter {
  2. @Override
  3. public void doFilter(Request request, Response response, FilterChain filterChain) {
  4. //请求处理特殊字符
  5. String str = request.getRequestStr()
  6. .replace('<', '[')
  7. .replace('>', ']');
  8. request.setRequestStr(str);
  9. filterChain.doFilter(request, response, filterChain);
  10. //响应处理的
  11. String responseMsg = response.getResponseStr() + "---HtmlFilter";
  12. response.setResponseStr(responseMsg);
  13. }
  14. }

SesitiveFilte

  1. public class SesitiveFilte implements Filter {
  2. @Override
  3. public void doFilter(Request request, Response response, FilterChain filterChain) {
  4. //请求处理特殊字符
  5. String str = request.getRequestStr()
  6. .replace("敏感", "**")
  7. .replace("不好", "**");
  8. request.setRequestStr(str);
  9. filterChain.doFilter(request, response, filterChain);
  10. //响应处理的
  11. String responseMsg = response.getResponseStr() + "---SesitiveFilte";
  12. response.setResponseStr(responseMsg);
  13. }
  14. }

责任链

  1. public class FilterChain implements Filter {
  2. List<Filter> filters = new ArrayList<Filter>();
  3. //记录运行到那个filter上
  4. int index = 0;
  5. public FilterChain addFilter(Filter f) {
  6. this.filters.add(f);
  7. return this;
  8. }
  9. @Override
  10. public void doFilter(Request request, Response response, FilterChain filterChain) {
  11. //没有filter了
  12. if (index == filters.size()) {
  13. return;
  14. }
  15. //取出filter
  16. Filter f = filters.get(index);
  17. index++;
  18. f.doFilter(request, response, filterChain);
  19. }
  20. }

消息处理程序

  1. @Data
  2. public class MsgProcessor {
  3. //保存请求
  4. private Request request;
  5. //保存响应
  6. private Response response;
  7. //保存调用链
  8. private FilterChain filterChain;
  9. public void process() {
  10. //调用责任链处理
  11. filterChain.doFilter(this.getRequest(), this.getResponse(), this.getFilterChain());
  12. }
  13. }

主程序

  1. //提前准备好请求和响应
  2. Request request = new Request();
  3. Response response = new Response();
  4. String msg = "大家好:), <script>: 敏感词, 不好";
  5. //请求需要处理的
  6. request.setRequestStr(msg);
  7. //响应需要处理的
  8. response.setResponseStr("abc---123");
  9. //初始化消息处理器
  10. MsgProcessor mp = new MsgProcessor();
  11. //把要处理的请求或者响应添加进去
  12. mp.setRequest(request);
  13. mp.setResponse(response);
  14. //初始化,责任链
  15. FilterChain fc = new FilterChain();
  16. //添加过滤器
  17. fc.addFilter(new HtmlFilter()).addFilter(new SesitiveFilte());
  18. //添加子链,这个子责任链是挂到主责任链上面的
  19. FilterChain fc2 = new FilterChain();
  20. fc2.addFilter(new FaceFilter());
  21. //把子链添加到责任链中
  22. fc.addFilter(fc2);
  23. //把责任链添加到消息处理器中
  24. mp.setFilterChain(fc);
  25. //进行消息处理
  26. mp.process();
  27. System.out.println(request.getRequestStr());
  28. System.out.println(response.getResponseStr());