十五、struts2中的拦截器(框架功能核心)
1、过滤器VS拦截器
功能是一回事。
过滤器是Servlet规范中的技术,可以对请求和响应进行过滤。
拦截器是Struts2框架中的技术,实现AOP(面向切面)的编程思想,可以对请求动作进行拦截。
2、自定义拦截器
步骤:
- 编写一个类,直接或间接实现 Interceptor接口。(拦截器会驻留内存),一般都选择继承AbstractInterceptor
public class MyInterceptor extends AbstractInterceptor {
// 主要的拦截方法
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 放行前执行
System.out.println("前");
// 可以认为是过滤器的放行
String result = invocation.invoke();
// 放行后执行
System.out.println("后");
return result;
}
}
b、需要在struts.xml中进行定义
<package name="p1" extends="struts-dafault">
<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="myinterceptor"
class="com.itheima.interceptors.MyInterceptor"></interceptor>
</interceptors>
</package>
c、在动作配置中就可以使用了
<action name="action1" class="com.itheima.action.DemoAction">
<!--默认使用Struts-default.xml文件中的一个名称为defaultStack的拦截栈 -->
<!--由于自己自定义了拦截器,所以默认的拦截器都失效了 -->
<interceptor-ref name="myinterceptor"></interceptor-ref>
<result>/success.jsp</result>
</action>
知识点:除了要使用自定义的拦截器之外,还要使用defaultStack,可以这么办
方法一:(自己使用)
<action name="action1" class="com.itheima.action.DemoAction">
<!--默认使用Struts-default.xml文件中的一个名称为defaultStack的拦截栈 -->
<!--由于自己自定义了拦截器,所以默认的拦截器都失效了 -->
<!--这里拦截器同时使用defaultStack和自定义的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myinterceptor"></interceptor-ref>
<result>/success.jsp</result>
</action>
方法二:(大家都用的时候)
<package name="mydefault" extends="struts-dafault" abstract="true">
<interceptors>
<!--自定义拦截器 -->
<interceptor name="myinterceptor"
class="com.itheima.interceptors.MyInterceptor"></interceptor>
<!--自定义拦截器栈 -->
<interceptor-stack name="mydefaultStack">
<!-- 引用默认拦截栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引用自定义拦截器 -->
<interceptor-ref name="myinterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 默认拦截器栈 -->
<default-interceptor-ref name="myinterceptor"></default-interceptor-ref>
</package>
<package name="p1" extends="mydefault">
<action name="action1" class="com.itheima.action.Demo1Action">
<!-- <interceptor-ref name="mydefaultStack"></interceptor-ref> -->
<result>/success.jsp</result>
</action>
</package>
3、自定义拦截器:能够指定拦截的方法或不拦截的方法
拦截器代码:
public class MyInterceptor extends MethodFilterInterceptor {
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("拦截了!");
return invocation.invoke();
}
}
Struts.xml文件配置:
<package name="p1" extends="struts-default">
<interceptors>
<!-- 自定义了一个拦截器 -->
<intercepter name="myInterceptor" class="com.itheima.interceptor.MyInterceptor">
</intercepter>
</interceptors>
<action name="*" class="com.itheima.action.Demo1Action" method="{1}">
<!--对当前动作类的所有方法都进行拦截 -->
<interceptor-ref name="myInterceptor">
<!-- 排除不要拦截的动作方法 -->
<param name="excludeMethods">action2,action1</param>
<!—-定义需要被拦截的方法-->
<param name="includeMethods">actioin3</param>
</interceptor-ref>
<result>/success.jsp</result>
</action>
</package>