目录结构
LogInterceptor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.bbs.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
// 日志拦截器
public class LogInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
// ActionInvocation实例,直接调用invoke方法,把当前拦截器执行过程交给
// 下一个拦截器,或者调用action的方法
System.out.println("执行了logInterceptor拦截器。。。上部分 ");
String rs = invocation.invoke();
System.out.println("执行了logInterceptor拦截器。。。下部分 ");
return rs;
}
}
struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<package name="animal" namespace="/animal" extends="person">
<interceptors>
<interceptor name="myLog" class="com.bbs.interceptor.LogInterceptor"/>
</interceptors>
<action name="a1" class="com.bbs.action.AnimalAction" method="login">
<result name="success">/WEB-INF/success.jsp</result>
<result name="error">/WEB-INF/error.jsp</result>
<interceptor-ref name="myLog"></interceptor-ref>
</action>
<action name="a2" class="com.bbs.action.AnimalAction" method="admin">
<result name="success">/WEB-INF/success.jsp</result>
<result name="error">/WEB-INF/error.jsp</result>
</action>
</package>
运行结果
- 经过测试,如果没有设置Struts核心拦截器,用户请求数据无法获取。
- 配置核心拦截器或拦截器栈。
- 其他的action或package不受影响,自定义的拦截器配置只对本action或包生效。
解决方法
需要配置核心拦截器或拦截器栈,如果自定义拦截器位于Struts核心拦截器前面,并且直接return视图名,可能会不经过核心拦截器,造成某些业务无法正常执行。
1
2
3
4
5
6
7
8
9
10
<interceptors>
<interceptor name="myLog" class="com.bbs.interceptor.LogInterceptor"/>
</interceptors>
<action name="a1" class="com.bbs.action.AnimalAction" method="login">
<result name="success">/WEB-INF/success.jsp</result>
<result name="error">/WEB-INF/error.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myLog"></interceptor-ref>
</action>
升级配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<interceptors>
<interceptor name="myLog" class="com.bbs.interceptor.LogInterceptor"/>
<interceptor-stack name="myStack">
<!-- 19个拦截器 其中一个是自定义的 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myLog"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="a1" class="com.bbs.action.AnimalAction" method="login">
<result name="success">/WEB-INF/success.jsp</result>
<result name="error">/WEB-INF/error.jsp</result>
</action>
再次升级配置
配置一个公共配置包,其他包中继承该公共配置包。
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 公共配置包 -->
<package name="default" namespace="" extends="struts-default">
<interceptors>
<interceptor name="myLog" class="com.bbs.interceptor.LogInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myLog"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
</package>
日志拦截器
LogInterceptor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.bbs.interceptor;
import java.lang.reflect.Method;
import javax.management.DescriptorKey;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
// 日志拦截器
public class LogInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
// ActionInvocation实例,直接调用invoke方法,把当前拦截器执行过程交给
// 下一个拦截器,或者调用action的方法
System.out.println("执行了logInterceptor拦截器。。。上部分 ");
String rs = invocation.invoke();
// 获取已经执行的action,以及执行的具体方法,
// 并且获取注解标记(注解中有针对相关操作的说明)
Object action = invocation.getAction();
String method = invocation.getProxy().getMethod();
// 通过反射,method是String类型,获取具体对象
Method m = action.getClass().getMethod(method, null);
DescriptorKey dk = m.getAnnotation(DescriptorKey.class);
String value = "";
if (dk != null) {
value = dk.value();
}
System.out.println("执行了:" + value + "操作");
System.out.println("执行了logInterceptor拦截器。。。下部分 ");
return rs;
}
}
AnimalAction.java
1
2
3
4
5
@DescriptorKey("执行了admin方法")
public String admin() {
System.out.println(admin);
return SUCCESS;
}