拦截器的的调用顺序

拦截器的的调用顺序

a:首先,要找到它自己有没有声明拦截器的引用,即<action>元素有没有<interceptor-ref>子元素,如果有,则不用继续寻找(即不会再使用b,c即默认的拦截器栈等),直接使用这些拦截器,如果没有进行下一步的查找。

b:其次,找到这个<action>所在包有没有声明默认的拦截器引用,即<package>元素的<default-interceptor-ref>子元素,如果有,则不用继续再找,直接使用这些拦截器,如果没有,则进行下一步的查找。

c:递归的查找这个包的父包,看看有没有声明默认的拦截器引用,直到找到默认的拦截器引用为止。

d:同一层下,拦截器的执行顺序为配置的顺序

补充:

abstract:把包声明为抽象包,抽象包就是用来被继承的(等待被继承)。只要是没有<action>元素的包,就可以声明为抽象包。(抽象包如果不被子包继承,它里面写的任何东西都不起作用) 

 注意:@ParentPackage("default")  值可以是一个抽象包,此时抽象包中的内容也会起作用(比如定义的拦截器等)相当于该抽象包被继承了。

拦截器的使用方式:
拦截器引用一般是两种方式
1,
如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,
如下(这里我是引用了struts2自带的checkbox拦截器),因为<action>下配置了拦截器,所以默认就不会使用b和c:
<package name="default" extends="struts-default" namespace="/ce">
<interceptors>
<interceptor name="loginInterceptor" class="com.action.LoginInterceptor"/>
</interceptors>
<action name="hello" class="com.action.HelloWorld" method="hello">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="defaultStack"></interceptor-ref>(必须加,否则不会使用默认拦截器栈中的拦截器)
<result name="success">/WEB-INF/index.jsp</result>
</action>
</package>

也可以改为对全局Action设置自己需要的拦截器,如下:
2,
struts-action.xml里面配置Action如下:
<!-- 一个公共包 -->
<package name="myDefault" extends="struts-default" abstract="true">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="checkLogin"
class="com.itheima.web.interceptors.CheckLoginInterceptor"/>
<!-- 定义一个拦截器栈 -->
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="checkLogin">
<!-- 由于我们使用了继承MethodFilterInterceptor,
此时我们可以告知拦截器,排除掉登录方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>(同一层下,拦截器的执行顺序为配置的顺序,即先执行checkLogin,后执行defaultStack下的19个拦截器)
</interceptor-stack>
</interceptors>
<!-- 修改默认拦截器栈,设置我们自定义的拦截器栈,
这样的话我们写的所有动作都有了检查登录功能。并且排除了登录方法-->
<default-interceptor-ref name="myDefaultStack"/>
<!-- 全局结果视图 -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
</package>

<!-- 配置动作,让此包继承我们自己写的公共包myDefault -->
<package name="customer" extends="myDefault" namespace="/customer">
<!-- 查询所有客户 -->
<action name="findAllCustomer" class="com.itheima.web.action.CustomerAction"
method="findAllCustomer">
<result name="findAllCustomer">/jsp/customer/list.jsp</result>
</action>
</package>

相关链接:

https://www.cnblogs.com/wwicked/articles/4455477.html

https://www.cnblogs.com/yw-ah/p/5761235.html

https://www.cnblogs.com/Ant-soldier/p/5490035.html

原文地址:https://www.cnblogs.com/zxwBj/p/8552471.html