Struts2拦截器、拦截器栈(Interceptor Stack)、全局拦截器与方法拦截器

标签: struts2.0 拦截器 拦截器栈 方法拦截器 全局拦截器
5080人阅读 评论(3) 收藏 举报
分类:

Struts2拦截器原理
Struts2拦截器是在访问某个Action或Action的方法之前或之后实施拦截。在请求Struts2的Action时,Struts2会查找配置文件,并根据配置文件实例化相应的拦截器对象。


Struts2拦截器配置
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>
    <package name="default" extends="struts-default">
        <!--配置拦截器-->
        <interceptors>
            <interceptor name="FirstInterceptor" class="Interceptor.FirstInterceptor">
                <!--初始化-->
                <param name="value" >YEN</param>
            </interceptor>
            <interceptor name="SecondInterceptor" class="Interceptor.SecondInterceptor">

            </interceptor>
        </interceptors>

        <action name="LoginAction" class="Action.LoginAction">
            <!--加拦截器-->
            <interceptor-ref name="FirstInterceptor"></interceptor-ref>
            <interceptor-ref name="SecondInterceptor"></interceptor-ref>
            <!--在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack-->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result name="success">success.jsp</result>
        </action>


    </package>
</struts>

FirstInterceptor

package Interceptor;

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

/**
 * Created with IntelliJ IDEA.
 * User: YEN
 * Date: 2016/8/3
 * Time: 13:59
 */
public class FirstInterceptor implements Interceptor {
    private String value;
    /**
     * 销毁方法
     */
    @Override
    public void destroy() {
        System.out.println("First拦截器销毁了");
    }

    /**
     * 初始化方法 当程序启动时拦截器就被初始化了
     */
    @Override
    public void init() {
        System.out.println("First拦截器初始化了");
    }

    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        //actionInvocation.invoke() 让到达拦截器的请求继续前进 访问需要访问的资源(就是放过的意思)
        System.out.println("进入First拦截器");
        String returnName=actionInvocation.invoke();
        System.out.println("走出First拦截器");
        return returnName;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

SecondInterceptor

package Interceptor;

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

/**
 * Created with IntelliJ IDEA.
 * User: YEN
 * Date: 2016/8/3
 * Time: 14:14
 */
public class SecondInterceptor implements Interceptor {
    @Override
    public void destroy() {
        System.out.println("Second拦截器销毁了");
    }

    @Override
    public void init() {
        System.out.println("Second拦截器初始化了");
    }

    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        //actionInvocation.invoke() 让到达拦截器的请求继续前进 访问需要访问的资源(就是放过的意思)
        System.out.println("进入Second拦截器");
        String returnName=actionInvocation.invoke();
        System.out.println("走出Second拦截器");
        return returnName;
    }
}

index.jsp

  <a href="LoginAction.action">点击调用拦截器</a>

这里写图片描述
这里写图片描述

由此也可以看出,拦截器执行的顺序与我们在配置文件中定义的顺序是一支的,即由外到内,而结束时则是从内到外。


拦截器栈

拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

可以把上面的struts.xml配置文件格式修改为下述,这样大大提高了Action的简洁性:

<?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="default" extends="struts-default">
        <!--配置拦截器-->
        <interceptors>
            <interceptor name="FirstInterceptor" class="Interceptor.FirstInterceptor">
                <param name="value" >YEN</param>
            </interceptor>
            <interceptor name="SecondInterceptor" class="Interceptor.SecondInterceptor"></interceptor>

            <interceptor-stack name="AllInterceptor">
                <interceptor-ref name="FirstInterceptor"></interceptor-ref>
                <interceptor-ref name="SecondInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <action name="LoginAction" class="Action.LoginAction">
            <interceptor-ref name="AllInterceptor"></interceptor-ref>
            <result name="success">success.jsp</result>
        </action>


    </package>
</struts>

这里写图片描述
执行结果是一样的。


全局拦截器

<?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="default" extends="struts-default">
        <!--配置拦截器-->
        <interceptors>
            <interceptor name="FirstInterceptor" class="Interceptor.FirstInterceptor">
                <param name="value" >YEN</param>
            </interceptor>
            <interceptor name="SecondInterceptor" class="Interceptor.SecondInterceptor"></interceptor>

            <interceptor-stack name="AllInterceptor">
                <interceptor-ref name="FirstInterceptor"></interceptor-ref>
                <interceptor-ref name="SecondInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!--默认拦截器(全局拦截器)-->
        <default-interceptor-ref name="AllInterceptor" ></default-interceptor-ref>

        <!--全局返回页面-->
        <global-results>
            <result>error.jsp</result>
        </global-results>

        <!--全局Action-->
        <default-action-ref name="LoginAction"></default-action-ref>

        <action name="LoginAction" class="Action.LoginAction">
            <interceptor-ref name="AllInterceptor"></interceptor-ref>
            <result name="success">success.jsp</result>
        </action>


    </package>
</struts>

方法拦截器
eg:拦截add和delete方法

<?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="default" extends="struts-default">
        <!--配置拦截器-->
        <interceptors>
            <!--方法拦截器配置-->
            <interceptor name="MethodInterceptor" class="Interceptor.MethodFirstceptor">
                <!--配置参数 :拦截什么方法-->
                <!--includeMethods控制能访问哪些-->
                <param name="includeMethods">add,delete</param>
                <!--excludeMethods控制能访问哪些-->
                <param name="excludeMethods">update</param>
        </interceptors>

        <action name="LoginAction" class="Action.LoginAction">
            <interceptor-ref name="MethodInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result name="success">success.jsp</result>
        </action>


    </package>
</struts>
package Interceptor;

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

/**
 * Created with IntelliJ IDEA.
 * User: YEN
 * Date: 2016/8/3
 * Time: 14:42
 */

/**
 * 方法拦截器 针对性非常强
 */
public class MethodFirstceptor extends MethodFilterInterceptor {
    @Override
    protected String doIntercept(ActionInvocation aInvocation) throws Exception {
        System.out.println("进入方法拦截器");
        String str=aInvocation.invoke();
        System.out.println("退出方法拦截器");
        return str;
    }
}
查看评论

Struts2 拦截器(Interceptor )原理和配置

一、Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成...
  • kingmax54212008
  • kingmax54212008
  • 2016年06月28日 18:08
  • 28614

struts2拦截器interceptor的三种配置方法

1、struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 package name="struts2" extends="struts-def...
  • xyw591238
  • xyw591238
  • 2016年07月19日 10:45
  • 6320

interceptor-stack跟interceptor-ref的区别

interceptor-stack是一堆拦截器组成的一个拦截器栈。也可以当拦截器使用。 interceptor-ref是指定某个action使用哪一个拦截器,可以是一个interceptor,也...
  • mmoooodd
  • mmoooodd
  • 2014年06月04日 11:35
  • 4398

什么是拦截器、拦截器栈?

Interceptor拦截器类似于我们前面学过的过滤器,是可以在action执行前后执行的代码。是我们做web开发时经常用的技术。比如:权限控制、日志等。我们也可以将多个Interceptor连在一起...
  • miachen520
  • miachen520
  • 2016年08月13日 14:53
  • 1557

拦截器,拦截器栈总结

拦截器(Interceptor):拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的。 拦截器跟filter的概念是非常类似的,拦截器只能拦截Action的,而filter...
  • yjsuge
  • yjsuge
  • 2011年08月04日 23:20
  • 4701

struts2中默认拦截器栈中的拦截器…

1:  com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor      While you can configure e...
  • li951418089
  • li951418089
  • 2015年12月24日 10:28
  • 1020

Struts2拦截器&拦截器栈 实例:登录验证拦截器

本篇源自 java1234小峰 尊重原创 热爱生活 Struts2 拦截器是在访问某个Action 或Action 的某个方法,字段之前或之后实施拦截,并且Struts2 拦截器是可 插拔的,拦截...
  • conglinyu
  • conglinyu
  • 2017年02月14日 22:02
  • 690

struts2多个自定义拦截器的栈

//struts.xml中: //加入自己的myStack栈,规定好拦截器顺序 //在最下方引用中,不再写拦截器引用,而是自定义拦截器栈的引用 ...
  • Amen_Wu
  • Amen_Wu
  • 2017年01月07日 06:00
  • 698

【SSH2(实践篇)】--Struts2拦截器精解

struts2拦截器提供了很强大的功能,使得开发人员能够在运行时控制输出结果,增加了编程的灵活性。另外对于任何理论性的东西都不要试图去记忆,一定要理性的去分析,多多实践,动手做几个实例,分析结果更深刻...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月03日 12:08
  • 14768

Struts2全局拦截器

Struts2全局拦截器
  • zoujian1993
  • zoujian1993
  • 2015年12月11日 15:31
  • 801
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 30万+
    积分: 4322
    排名: 8712
    联系方式

    博文主要参考网上资料,视频笔记,结合个人见解,仅供学习、交流使用,如有侵权,请联系博主删除。


    博客专栏
    最新评论