Struts2拦截器

拦截器的概述

拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截后,对该方法之前或者之后加入某些操作。拦截器是一种AOP编程思想。
拦截器是动态拦截Action调用的对象,它提供了一种机制,可以使开发者可以定义在一个Action执行的前后的代码,也可以在一个Action执行前阻止其执行。同时也提供了一种可以提取action中可重用部分的方式。
谈到拦截器,有一个词大家应该都比较熟悉——拦截器链(Interceptor Chain,在struts2中称为拦截器栈——Interceptor Stack)。拦截器链就是将拦截器按照一定的顺序连接成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按照其定义的顺序被调用

拦截器的实现原理

拦截器的方法都是通过动态代理的方式来实现调用的。struts2的拦截器实现相对简单,当请求到达struts2的ServletDispatcher时,struts2会查找配置文件,并根据其配置实例化相应的拦截器对象,然后串成一个列表,最后通过递归的方式调用每一个拦截器。

struts2的执行流程图
这里写图片描述

创建自定义拦截器

方式一:实现Interceptor接口
该接口包含了三个方法
void init():该方法在拦截器被创建后会立即调用,它在拦截器的生命周期中只被调用一次,可以在该方法中对相应的资源或数据进行必要的初始化。
void destory():该方法与init()方法相对应,用于在拦截器实例被销毁之前,将调用该方法,可以用来释放和拦截器相关的资源,也只会被调用一次。
String intercept(ActionInvocation arg0) throws Exception:该方法是拦截器的核心方法,用来添加真正执行拦截工作的代码,实现具体的拦截操作,它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到相应的视图资源。每拦截一个动作请求,该方法就会被调用一次。该方法的ActionInvocation参数包含了被拦截的Action的引用,可以通过调用该参数的Invoke()方法,实现对该方法的放行,即将控制权转交给下一个拦截器或者交给Action中的execute()方法。

package cn.itcast.a_interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

//拦截器:第一种创建方式
//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor {
    @Override
    //初始化方法
    public void init() {
    }

    @Override
    //拦截方法
    public String intercept(ActionInvocation arg0) throws Exception {
        return null;
    }

    @Override
    //销毁方法
    public void destroy() {
    }
}

方式二:继承AbstractInterceptor抽象类
该类实现了Interceptor接口,并提供了init()和destory()方法的空实现,使用时,可以直接继承该抽象类,而不用实现不需要的方法。

package cn.itcast.a_interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

//创建方式2: 继承AbstractInterceptor -> struts2的体贴
//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
public class MyInterceptor2 extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        return null;
    }
}

方式三:继承MethodFilterInterceptor 类
这是一个方法过滤拦截器,可以指定哪些方法需要拦截,哪些不需要拦截

package cn.itcast.a_interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

//继承:MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
//  定制哪些方法需要拦截.
//  定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        //前处理
        System.out.println("MyInterceptor3 的前处理!");
        //放行
        String result = invocation.invoke();
        //后处理
        System.out.println("MyInterceptor3 的后处理!");

        return result;
    }
}

定义一个Action,添加4个方法

package cn.itcast.a_interceptor;

import com.opensymphony.xwork2.ActionSupport;

public class Demo1Action extends ActionSupport {

    public String add() throws Exception {
        System.out.println("Demo1Action_add!");
        return SUCCESS;
    }

    public String delete() throws Exception {
        System.out.println("Demo1Action_delete!");
        return SUCCESS;
    }

    public String update() throws Exception {
        System.out.println("Demo1Action_update!");
        return SUCCESS;
    }

    public String find() throws Exception {
        System.out.println("Demo1Action_find!");
        return SUCCESS;
    }
}

配置拦截器
包含了指定哪些方法需要被拦截的配置

<?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>
    <package name="inter" namespace="/" extends="struts-default" >
    <interceptors>
    <!-- 1.注册拦截器 -->
        <interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3"></interceptor>
    <!-- 2.注册拦截器栈 -->
        <interceptor-stack name="myStack">
            <!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
            <interceptor-ref name="myInter3">
                 <!-- 指定哪些方法不拦截
                 <param name="excludeMethods">add,delete</param> -->
                 <!-- 指定哪些方法需要拦截 -->
                 <param name="includeMethods">add,delete</param>
            </interceptor-ref>
            <!-- 引用默认的拦截器栈(20个) -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </interceptor-stack>    
    </interceptors>
    <!-- 3.指定包中的默认拦截器栈 -->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>
        <action name="Demo1Action_*" class="cn.itcast.a_interceptor.Demo1Action" method="{1}" >
            <!-- 为Action单独指定走哪个拦截器(栈) 
            <interceptor-ref name="myStack"></interceptor-ref>-->
            <result name="success" type="dispatcher" >/index.jsp</result>
        </action>
    </package>
</struts>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值