设计模式-拦截器模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计模式-拦截器模式
看到strut2的Interceptor(拦截器),
tomcat源码的Valve(tomcat中各种各样容器如Wrapper,Context都是靠Valve实现各种功能),
以及最早学习到的java web中的javax.servlet.Filter的概念,
都是⼀种链式的处理流程,这⼀个环节处理完成,然后处理另⼀个环节,这样就可以在⼀个处理本⾝的之前和之后做⼀些事情了。
⽐如说,struts2中Action在执⾏之前会⾸先执⾏⼀些Interceptor,完成诸如权限验证/属性注⼊/Validation/国际化等等的功能,
我看过⼀个⽐较好的功能是,利⽤strut2的拦截器和*-Validation.xml⽂件以及标签(strut2标签,主要是form-close.ftl这个模板⽂件),⾃动⽣成页⾯的Form前端验证。(当然辅助的客户端js⽂件如jquery/jquery-validation也是需要的)。
以上的这些功能,通过⼀种名为责任链或者拦截器或者过滤器(语义上的区别⽽技术上没有什么区别,知道做了什么就⾏了)的设计模式可以实现,那么就来看看什么是责任链的设计模式。
以下内容参考北京尚学堂的马⼠兵⽼师的设计模式视频,在此感谢。
Filter的概念
引⼊FilterChain的概念
模仿马⽼师写的代码,
地址1:(filter的单向过滤的简单实现)
地址2:(模仿java web的filter实现双向过滤)
既处理从客户端到服务器的消息,⼜处理从服务器到客户端的消息,这样的过滤器该怎么设计呢?
⾸先,构造两个类,Request和Response,分别代表请求和响应,
其次,因为要满⾜⾸先执⾏Request的过滤然后执⾏Response的过滤以及正序执⾏Request的过滤和反序执⾏Response的过滤,所以在doFilter⽅法中加⼊FilterChain的引⽤,
这样可以依次先对Request进⾏下⼀个Filter的处理,然后反过来再处理Response的过滤。
模仿马⽼师写的代码,地址:
分析strut2中interceptorsStack(拦截器栈)
⾸先,执⾏action之前会按照顺序执⾏所有的interceptor,执⾏action之后返回⼀个结果字符串也会按照同之前相反的顺序执⾏所有的interceptor。
我觉得,⾸先,执⾏action之后的所有interceptor是必须执⾏的,且先于对action执⾏完之后返回的结果进⾏处理,并且是有严格顺序的。⾄于是不是对action执⾏完之后返回的结果进⾏处理,以及处理顺序,看到到是次要的?
如果request请求不合乎⼀个拦截器的请求条件,如权限检查的拦截器,停⽌后续处理,如何实现?