Struts2(10)之拦截器

Struts2(10)之拦截器

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

概述

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>

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/struts2-10.html

Buy me a cup of coffee ☕.