Home StrutsMVCDemo5 - Struts2拦截器的使用(2.2.3)
Post
Cancel

StrutsMVCDemo5 - Struts2拦截器的使用(2.2.3)

目录结构

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;
}

运行结果

This post is licensed under CC BY 4.0 by the author.