十五、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>