struts2学习笔记---自定义拦截器

什么是拦截器?

struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器。其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作。

实现原理

当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

拦截器的执行流程

1、对Action进行预处理。(正序执行)

2、拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定)。

3、对Action进行后期处理。(倒序执行)

源码:自定义拦截器

方法一:实现Interceptor接口,重写其方法

package org.Test.interceptor;

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

public class TestInterceptor1 implements Interceptor { //实现Interceptor接口

    public TestInterceptor1() { // 构造方法,服务器启动时就生成一个interceptor实例
        System.out.println("TestInterceptor1 cons");
    }

    @Override
    public void destroy() { // 类似于析构方法,用于释放资源
        System.out.println("TestInterceptor1 destory");
    }

    @Override
    public void init() { // 服务器启动时被调用来初始化一些相关资源,类似于构造方法
        System.out.println("TestInterceptor1 init");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("TestInterceptor1 intercept go"); // 开始执行该拦截器
        String resultName = invocation.invoke(); // 执行下一个拦截器或执行Action的execute()方法
        System.out.println("TestInterceptor1 intercept back"); // 返回该拦截器

        System.out.println("TestInterceptor1 resultName:" + resultName); // 打印调用的下一个拦截器或Action的返回值
        return resultName;
    }

}

方法二:继承MethodFilterInterceptor类,重写doIntercept()方法

package org.Test.interceptor;

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

public class TestInterceptor2 extends AbstractInterceptor{  //继承AbstractInterceptor,无需重写init(),destroy()方法

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("TestInterceptor2 intercept go");
        String resultName = invocation.invoke();
        System.out.println("TestInterceptor2 intercept back");

        System.out.println("TestInterceptor2 resultName:" + resultName);
        return resultName;
    }

}

源码:配置struts.xml

<package name="default" namespace="/" extends="struts-default">

        <!-- 配置自定义拦截器 -->
        <interceptors>
            <interceptor name="TestInterceptor1" class="org.Test.interceptor.TestInterceptor1"/>
            <interceptor name="TestInterceptor2" class="org.Test.interceptor.TestInterceptor2"/>
        </interceptors>

        <default-action-ref name="default" />

        <action name="test" class="org.Test.action.TestAction">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>

            <!-- 在这个Action中使用自定义的拦截器 -->
            <interceptor-ref name="TestInterceptor1"/>
            <interceptor-ref name="TestInterceptor2"/>
        </action>

        <action name="default">
            <result>/index.jsp</result>
        </action>
    </package>

源码:Action的定义

public class TestAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("TestAction execute");
        return SUCCESS;
    }
}

运行结果

1.拦截器按其在action中加入的先后顺序依次被调用,这里先调用TestInterceptor1,后调用TestInterceptor2。

2.当所有的拦截器执行完了之后才执行Action

3.然后从Action依次往上一个调用点后退,从TestAction退到TestInterceptor2,从TestInterceptor2退到TestInterceptor1。

来一张图理解

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 00:34:25

struts2学习笔记---自定义拦截器的相关文章

struts2学习(6)自定义拦截器-登录验证拦截器

需求:对登录进行验证,用户名cy 密码123456才能登录进去:  登录进去后,将用户存在session中: 其他链接要来访问(除了登录链接),首先验证是否登录,对这个进行拦截: com.cy.model.User.java: package com.cy.model; public class User { private String userName; private String password; public String getUserName() { return userNam

Struts2重新学习之自定义拦截器(判断用户是否是登录状态)

拦截器 一:1:概念:Interceptor拦截器类似于我们学习过的过滤器,是可以再action执行前后执行的代码.是web开发时,常用的技术.比如,权限控制,日志记录. 2:多个拦截器Interceptor连在一起组成了Interceptor栈.拦截器是AOP面向切面编程的一种实现,具有热插拔的效应. 3:Struts2拦截器,每个拦截器类只有一个对象实例,即采用了单利模式.所有引用这个拦截器的action都共享着一拦截器类的实例. 拦截器和过滤器的区别 1:拦截器和过滤器的概念非常类似 2:

springmvc学习笔记(20)-拦截器

springmvc学习笔记(20)-拦截器 springmvc学习笔记20-拦截器 拦截定义 拦截器配置 针对HandlerMapping配置 类似全局的拦截器 拦截测试 拦截器应用实现登陆认证 需求 登陆controller方法 登陆认证拦截实现 本文主要介绍springmvc中的拦截器,包括拦截器定义和的配置,然后演示了一个链式拦截的测试示例,最后通过一个登录认证的例子展示了拦截器的应用 拦截定义 定义拦截器,实现HandlerInterceptor接口.接口中提供三个方法. public

在struts2中配置自定义拦截器放行多个方法

源码: 自定义的拦截器类: //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.inte

Struts学习之自定义拦截器

* 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类    * 要重写init().intercept().destroy()方法        * init()是在struts2框架运行时执行,在拦截器的生命周期中只执行一次,可以做必要的内容的初始化工作        * intercept(),是每一次请求就执行一次,做相关处理工作.            * intercept()方法接收一个ActionInvocation接口的实例     

struts2框架之自定义拦截器和配置

struts框架中也存在拦截器,只不过系统自动调用.框架自带的拦截器的配置文件所在的位置为: java Resources--->Libraries--->struts2-core-2.3.36.jar(核心包)--->struts-default.xml 这个配置文件中放置的是框架所有的拦截器,拦截器放置在拦截器栈中<interceptor-stack>.在配置文件中有一个基本拦截器栈,我们如果需要使用拦截器的时候,调用基本拦截器就可以了. 如果我们想要实现自己定义的功能,

Struts学习笔记_拦截器

1.Struts架构图 2.Struts执行过程分析 3.Interceptor拦截器过程模拟 //main.java public class Main { public static void main(String[] args) { new ActionInvocation().invoke(); } } //ActionInvocation .java public class ActionInvocation { List<Interceptor> interceptors = n

整合spring之后,struts2里面的自定义拦截器的invocation.invoke()总是返回input

这个真的是整死我了,还好看见了一篇博客提示了我, 解决方法: 在spring的bean配置中我没有设置action的作用域为prototype,也就是多例的,如果不设置则就会是默认的singleton. 也就是我们每次去调用action的时候都应该是一个新的action,而不是之前的action,所以就应该是多例模式的,而不是单例模式 哎!整死我了! 我把原文博客分享在这里: https://blog.csdn.net/zml_2015/article/details/50266783 原文地址

[原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------