博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
责任链设计模式
阅读量:6937 次
发布时间:2019-06-27

本文共 3432 字,大约阅读时间需要 11 分钟。

责任链的应用场景

  • Servlet API 中的 Filter 过滤器
  • MVC 框架中的拦截器
  • . . .

filter

简单使用责任链模式拆分 Servlet API 中的过滤器

模拟 Servlet 中的 Request 对象

/** * @desc 模拟 Servlet 中的 Request 对象 *  * @author jiang ru yi */public class HttpServletRequest {    private String requestContext;    private Map
requestParam = new HashMap<>(); public String getRequestContext() { return requestContext; } public void setRequestContext(String requestContext) { this.requestContext = requestContext; } public void setRequestParam(Map
requestParam) { this.requestParam = requestParam; } public Object setAttribute(String key, Object value) { return requestParam.put(key, value); } public Object getAttribute(String key) { return requestParam.get(key); } public Object removeAttribute(String key) { return requestParam.remove(key); } }

模拟 Servlet 中的 Response 对象

/** * @desc 模拟 Servlet 中的 Response 对象 *  * @author jiang ru yi */public class HttpServletResponse {    private String responseContext;    public String getResponseContext() {        return responseContext;    }    public void setResponseContext(String responseContext) {        this.responseContext = responseContext;    }}

过滤器抽象层

/** * @desc 公用的过滤器抽象层 *  * @author jiang ru yi */public abstract class HttpFilter {        public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain);}

过滤器调度

/** * @desc 过滤器的调度器 *  * @author jiang ru yi */public class FilterChain {    private List
filters = new ArrayList<>(); private int currFilter; public boolean addFilter(HttpFilter filter) { return filters.add(filter); } public boolean removeFilter(HttpFilter filter) { return filters.remove(filter); } public void doFilter(HttpServletRequest request, HttpServletResponse response) { if (currFilter++ == filters.size()) return; filters.get(currFilter - 1).doFilter(request, response, this); }}

Junit 测试

public static void main(String[] args) {    HttpServletRequest request = new HttpServletRequest();    request.setRequestContext("
, Y(OvO)Y"); request.setAttribute("user", "administrator"); HttpServletResponse response = new HttpServletResponse(); FilterChain chain = new FilterChain(); chain.addFilter(new CharacterSetFilter()); chain.addFilter(new PowerFilter()); chain.doFilter(request, response); System.out.println(request.getRequestContext());}

抽象层子类 : 字符过滤器

/** * @desc 过滤请求中的危险符号( < > ) *  * @author jiang ru yi */public class CharacterSetFilter extends HttpFilter {    @Override    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {        String context = request.getRequestContext();        String result = context.replaceAll("<", "≤").replaceAll(">", "<");        request.setRequestContext(result);        chain.doFilter(request, response);    }}

抽象层子类 : 校验用户是否登录

/** * @desc 过滤用户是否登录 *  * @author jiang ru yi */public class PowerFilter extends HttpFilter {    @Override    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {        Object attribute = request.getAttribute("user");        if (null != attribute) {            chain.doFilter(request, response);        } else {            throw new RuntimeException("user not login");        }    }}

转载地址:http://xsbnl.baihongyu.com/

你可能感兴趣的文章
使用sql追踪
查看>>
5: EL 表达式小结
查看>>
[数组]数组元素分割
查看>>
今日学习20190427
查看>>
HIbernate小结
查看>>
iOS开发-数据存储
查看>>
iOSUI-UIScrollView属性,方法大全
查看>>
2015大连华信校园招聘面试题--堆栈
查看>>
常用架构选型
查看>>
POJ 2533 Longest Ordered Subsequence
查看>>
机器学习入门-提取文章的主题词 1.jieba.analyse.extract_tags(提取主题词)
查看>>
一、javaSE (五)方法和数组知识
查看>>
关于如何在虚拟机里访问到自己的本机里的本地项目
查看>>
浅谈对xmpp的理解及应用
查看>>
postgresql备份导入数据库小记
查看>>
翻译随笔
查看>>
java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求,...
查看>>
nfs挂载
查看>>
Dubbo坑
查看>>
Git
查看>>