概述
Struts2 的拦截器(Interceptor)是指在访问某个 Action 或 Action 的某个方法,字段之前或之后实施拦截,并且 Struts2 拦截器是可插拔的,拦截器是 AOP 的一种实现。
Struts2 还有拦截器栈的概念,实际上指的就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2 拦截器链中的拦截器就会按其之前定义的顺序被调用。
-
Filter:过滤器,过滤客户端向服务器发送的请求。
-
Interceptor:拦截器,拦截的是客户端对 Action 的访问,是更细粒度化的拦截。
Struts2 框架的核心功能都是通过拦截器实现。
自定义拦截器
编写拦截器类
编写一个类实现 Interceptor
接口或继承 AbstractInterceptor
类。
方式一:实现 Interceptor 接口
// com.zze.interceptor.Test1Interceptor
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class Test1Interceptor implements Interceptor {
@Override
public void destroy() {
System.out.println("from Test1Interceptor.destroy");
}
@Override
public void init() {
System.out.println("from Test1Interceptor.init");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("from Test1Interceptor.intercept");
return invocation.invoke();
}
}
方式二:继承 AbstractInterceptor 类
// com.zze.interceptor.Test2Interceptor
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class Test2Interceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Test2Interceptor.intercept");
return invocation.invoke();
}
}
配置拦截器
方式一:引入拦截器
<!-- struts.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="test" extends="struts-default" namespace="/">
<!--定义拦截器-->
<interceptors>
<interceptor name="interceptor1" class="com.zze.interceptor.Test1Interceptor"/>
<interceptor name="interceptor2" class="com.zze.interceptor.Test2Interceptor"/>
</interceptors>
<action name="*" class="com.zze.action.{1}Action">
<result>/index.jsp</result>
<!--引入拦截器-->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="interceptor1"/>
<interceptor-ref name="interceptor2"/>
</action>
</package>
</struts>
方式二:引入拦截器栈
<!-- struts.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="test" extends="struts-default" namespace="/">
<!--定义拦截器-->
<interceptors>
<interceptor name="interceptor1" class="com.zze.interceptor.Test1Interceptor"/>
<interceptor name="interceptor2" class="com.zze.interceptor.Test2Interceptor"/>
<!--定义拦截器栈-->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="interceptor1"/>
<interceptor-ref name="interceptor2"/>
</interceptor-stack>
</interceptors>
<action name="*" class="com.zze.action.{1}Action">
<result>/index.jsp</result>
<!--引入拦截器栈-->
<interceptor-ref name="myStack"/>
</action>
</package>
</struts>
补充
Struts2 还为我们提供了一些功能增强的过滤器,我们只需要继承它简单配置即可,例如:
// com.zze.interceptor.TestInterceptor
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/**
* MethodFilterInterceptor 可以让我们很简单的控制要拦截的方法和不需拦截的方法
*/
public class TestInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("from TestInterceptor.doIntercept");
return invocation.invoke();
}
}
<!-- struts.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="test" extends="struts-default" namespace="/">
<!--定义拦截器-->
<interceptors>
<interceptor name="methodInterceptor" class="com.zze.interceptor.TestInterceptor"/>
</interceptors>
<action name="*_*" class="com.zze.action.{1}Action" method="{2}">
<result>/index.jsp</result>
<interceptor-ref name="methodInterceptor">
<!--配置不拦截的方法名-->
<param name="excludeMethods">login,index</param>
<!--配置要拦截的方法名-->
<param name="includeMethods">home,list</param>
</interceptor-ref>
</action>
</package>
</struts>
评论区