拦截器 采用 责任链 模式
* 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
* 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行
在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 )
1、 struts2 所有拦截器 都必须实现 Interceptor 接口
2、 AbstractInterceptor 类实现了 Interceptor 接口. 并为 init, destroy 提供了一个空白的实现
所有实际开发中,自定义拦截器 只需要 继承 AbstractInterceptor类, 提供 intercept 方法实现
3、 常用struts2 拦截器
<interceptor-ref name="modelDriven"/> 模型驱动
<interceptor-ref name="fileUpload"/> 文件上传
<interceptor-ref name="params"> 参数解析封装
<interceptor-ref name="conversionError"/> 类型转换错误
<interceptor-ref name="validation"> 请求参数校验
<interceptor-ref name="workflow"> 拦截跳转 input 视图
自定义拦截器:
1.创建一个类,实现Interceptor接口或继承 AbstractInterceptor
注意:要想让拦截器继续向下执行需要通过 ActionInvocation调用它的invoke方法.
2.在struts.xml文件中针对特定的action进行配置.
在<package>下可以通过
<interceptors>来对自己的拦截器进行配置
例如:
<interceptors>
<interceptor name="privilege" class="cn.itcast.utils.PrivilegeInterceptor"></interceptor>
</interceptors>
可以在action中通过
<interceptor-ref name="privilege"/>
来引用你配置的拦截器.
注意:如果在一个action中显示的配置了一个拦截器,那么我们所使用的默认的拦截器栈default-Stack就会失效。
<interceptor-stack>它用于配置一个拦截器栈。
注意事项总结:
1.让拦截器可以向下执行 ActionInvocation.invoke();
2.拦截器配置注意事项:如果显示的配置了一个拦截器,那么默认使用的defaultStack失效,需要手动在配置一下。
3.如果要针对action中某个方法拦截可以使用MethodFilterInterceptro来操作