SPRING与设计模式---责任链模式

本文深入探讨了Spring Security框架中责任链模式的应用,详细解释了如何通过动态添加和删除责任来处理请求,展示了该模式在Spring框架中的具体实现。

SPRING与设计模式---责任链模式

2018年02月24日 16:17:20 json20080301 阅读数:822更多

个人分类: 架构设计模式

所属专栏: SpringSecurity4源码解读

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/json20080301/article/details/79362976

SPRING与设计模式---责任链模式

 使用场景:当你想让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式。

spring框架中的应用:

spring安全框架security使用责任链模式,框架使用者可以动态地添加删除责任(处理request请求)。

UML类图:

活动图:

 

源码解析:currentPosition表示责任链的要处理请求链条节点的位置,使用additionalFilters来依次处理request请求。additionalFilters中的每个Filter成员都承担某一项具体职责,并且每个Filter都会被执行到。 责任链条的成员执行完自己的职责后,会回调链条的处理请求方法,责任链条会找到下一个链条成员来执行职责,直到链条尾端。

 
  1. private static class VirtualFilterChain implements FilterChain {

  2. private final FilterChain originalChain; //链条中的节点全部执行完后,处理request请求的对象

  3. private final List<Filter> additionalFilters; //请求实际执行者,

  4. private final FirewalledRequest firewalledRequest;

  5. private final int size;

  6. private int currentPosition = 0; //链条移动的位置,当currentPosition==size,到达链条的尾端。

  7. private VirtualFilterChain(FirewalledRequest firewalledRequest,

  8. FilterChain chain, List<Filter> additionalFilters) {

  9. this.originalChain = chain;

  10. this.additionalFilters = additionalFilters;

  11. this.size = additionalFilters.size();

  12. this.firewalledRequest = firewalledRequest;

  13. }

  14.  
  15. public void doFilter(ServletRequest request, ServletResponse response)

  16. throws IOException, ServletException {

  17. if (currentPosition == size) { //到达链条尾端

  18. if (logger.isDebugEnabled()) {

  19. logger.debug(UrlUtils.buildRequestUrl(firewalledRequest)

  20. + " reached end of additional filter chain; proceeding with original chain");

  21. }

  22.  
  23. // Deactivate path stripping as we exit the security filter chain

  24. this.firewalledRequest.reset();

  25.  
  26. originalChain.doFilter(request, response);

  27. }

  28. else {

  29. currentPosition++; //依次移动链条指针到具体节点

  30.  
  31. Filter nextFilter = additionalFilters.get(currentPosition - 1);

  32.  
  33. if (logger.isDebugEnabled()) {

  34. logger.debug(UrlUtils.buildRequestUrl(firewalledRequest)

  35. + " at position " + currentPosition + " of " + size

  36. + " in additional filter chain; firing Filter: '"

  37. + nextFilter.getClass().getSimpleName() + "'");

  38. }

  39.  
  40. nextFilter.doFilter(request, response, this);//将链条本身的对象传递给链条成员

  41. }

  42. }

  43. }

链条成员Filter会执行chain.doFilter(request, response )方法,而chain是链条本身的引用,这样成员就将请求又重新交给了链条。看SecurityContextHolderAwareRequestFilter源码:

 

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
      throws IOException, ServletException {
   chain.doFilter(this.requestFactory.create((HttpServletRequest) req,
         (HttpServletResponse) res), res);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值