概述: 责任链模式是一种对象的行为模式. 在责任链模式里, 很多对象由每一个对象对其下家的引用而连接起来形成一条链. 请求在这个链上传递, 直到链上的某一个对象
决定处理此请求. 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求, 这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任.
角色: 抽象处理者 (定义出一个处理请求的接口. 如果需要, 接口可以定义 出一个方法以设定和返回对下家的引用. 这个角色通常由一个 Java 抽象类或者 Java 接口实现.), 具体执行者 (具体处理者接到请求后, 可以选择将请求处理掉, 或者将请求传给下家. 由于具体处理者持有对下家的引用, 因此, 如果需要, 具体处理者可以访问下家)
众所周知 Tomcat 中的 Filter 就是使用了责任链模式, 创建一个 Filter 除了要在 web.xml 文件中做相应配置外, 还需要实现 javax.servlet.Filter 接口.
- public class TestFilter implements Filter{
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- chain.doFilter(request, response);
- }
- public void destroy() {
- }
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- }
应用: Servlet API 中提供了一个 Filter 接口, 开发 Web 应用时, 如果编写的 Java 类实现了这个接口, 则把这个 java 类称之为过滤器 Filter. 通过 Filter 技术, 开发人员可以实现用户在访问某个目标资源之前, 对访问的请求和响应进行拦截. 简单说, 就是可以实现 Web 容器对某资源的访问前截获进行相关的处理, 还可以在某资源向 Web 容器返回响应前进行截获进行处理.
StandardWrapperValve.invoke() 方法
创建一个过滤器链, 并把待执行的 servlet 对象存放到过滤器链中.
ApplicationFilterFactory.createFilterChain() 方法
过滤器的顺序是按照 Web.xml 中的先后顺序执行的
把要执行的 servlet 存放到过滤器链中.
如果没有配置过滤器则 return 一个空的过滤器链 (只包含上面设置的 servlet).
如果配置过滤器, 则把所有配置的过滤器加入到过滤器链中
首先判断 filter-mapping 中配置的 dispatcher 规则, 如果符合则进入下一步
然后判断 filter-mapping 中配置的 url-pattern 规则, 如果符合则添加到过滤器链
StandardWrapperValve.invoke() 方法
如果 servlet 和过滤器链都不为空, 则开始调用过滤器链的 doFilter() 方法
ApplicationFilterChain.doFilter()->internalDoFilter()
pos: 为过滤器链中当前执行的过滤器下标.
n: 过滤器链中的过滤器个数.
每执行一个过滤器则把过滤器链中的 post+1(下标), 直到所有的过滤器的 doFilter 方法都调用成功.
这行代码是责任链设计模式的核心, 把当前的过滤链传入到 doFilter 方法中.
这样在 Filter 中进行拦截, 通过过滤器判断是否要进行调用下一个过滤器链
过滤器链中的所有过滤器的 doFilter 方法都执行完成后, 最后再调用过滤器链中存放的 servlet.service() 方法.
来源: http://www.bubuko.com/infodetail-2994102.html