服务器启动时实例化 StrutsPrepareAndExecuteFilter,读取struts所有配置文件,把每一个Action实例化,当一个请求访问的时候,StrutsPrepareAndExecuteFilter会把请求拦截下来,匹配一个ActionMapper,然后ActionMapper创建ActionProxy,然后执行默认拦截器栈,再执行Action,返回结果,然后默认拦截器再反向执行(做一些运行期监控和清理工作,不是每一拦截器都执行后置拦截),最后响应结果返回给页面
一、自定义拦截器,创建拦截器类,继承ActionInterceptor
在struts.xml文件中配置拦截器和拦截器栈,将自定义的拦截器添加到创建的拦截器栈中,并在拦截器栈中引入默认的拦截器栈defaultStack,最后设置默认拦截器引用设置为创建的拦截器栈。
1 <package name="myStruts-Default" extends="struts-default" abstract="true"> 2 <interceptors> 3 <!-- 配置我们自己的拦截器 --> 6 <interceptor name="myInterceptor" class="com.rl.interceptor.MyInterceptor"></interceptor> 7 <!-- 拦截器栈:是把多个拦截器集中到一起统一被引用 --> 10 <interceptor-stack name="rlStack"> 11 <!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈--> 14 <interceptor-ref name="defaultStack"></interceptor-ref> 15 <interceptor-ref name="myInterceptor"></interceptor-ref> 16 </interceptor-stack> 17 </interceptors> 18 <!-- 把rlStack作为默认拦截器,只要继承了myStruts-Default,执行Action时就会自动先执行rlStack中的所有拦截器 --> 21 <default-interceptor-ref name="rlStack"/> 22 </package>
二、排除Action的拦截
创建拦截器继承 MethodFilterInterceptor
1 <!-- 当前Action需要主动管理默认拦截器栈 --> 2 <interceptor-ref name="rlStack"> 3 <!-- 指定要排除的拦截器 name:要排除的拦截器的名字.exludeMethods 元素:要排除的方法--> 4 <param name="myInterceptor1.excludeMethods">delete</param> 5 </interceptor-ref>