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都会被执行到。 责任链条的成员执行完自己的职责后,会回调链条的处理请求方法,责任链条会找到下一个链条成员来执行职责,直到链条尾端。
-
private static class VirtualFilterChain implements FilterChain { -
private final FilterChain originalChain; //链条中的节点全部执行完后,处理request请求的对象 -
private final List<Filter> additionalFilters; //请求实际执行者, -
private final FirewalledRequest firewalledRequest; -
private final int size; -
private int currentPosition = 0; //链条移动的位置,当currentPosition==size,到达链条的尾端。 -
private VirtualFilterChain(FirewalledRequest firewalledRequest, -
FilterChain chain, List<Filter> additionalFilters) { -
this.originalChain = chain; -
this.additionalFilters = additionalFilters; -
this.size = additionalFilters.size(); -
this.firewalledRequest = firewalledRequest; -
} -
public void doFilter(ServletRequest request, ServletResponse response) -
throws IOException, ServletException { -
if (currentPosition == size) { //到达链条尾端 -
if (logger.isDebugEnabled()) { -
logger.debug(UrlUtils.buildRequestUrl(firewalledRequest) -
+ " reached end of additional filter chain; proceeding with original chain"); -
} -
// Deactivate path stripping as we exit the security filter chain -
this.firewalledRequest.reset(); -
originalChain.doFilter(request, response); -
} -
else { -
currentPosition++; //依次移动链条指针到具体节点 -
Filter nextFilter = additionalFilters.get(currentPosition - 1); -
if (logger.isDebugEnabled()) { -
logger.debug(UrlUtils.buildRequestUrl(firewalledRequest) -
+ " at position " + currentPosition + " of " + size -
+ " in additional filter chain; firing Filter: '" -
+ nextFilter.getClass().getSimpleName() + "'"); -
} -
nextFilter.doFilter(request, response, this);//将链条本身的对象传递给链条成员 -
} -
} -
}
链条成员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);
}
本文深入探讨了Spring Security框架中责任链模式的应用,详细解释了如何通过动态添加和删除责任来处理请求,展示了该模式在Spring框架中的具体实现。
1799

被折叠的 条评论
为什么被折叠?



