Struts2–自定义拦截器三种方式(实现Interceptor接口、继承抽象类AbstractInterceptor、继承MethodFilterInterceptor)「建议收藏」

Struts2–自定义拦截器三种方式(实现Interceptor接口、继承抽象类AbstractInterceptor、继承MethodFilterInterceptor)「建议收藏」实现自定义拦截器在实际的项目开发中,虽然Struts2的内建拦截器可以完成大部分的拦截任务,但是,一些与系统逻辑相关的通用功能(如权限的控制和用户登录控制等),则需要通过自定义拦截器实现。本节将详细讲解如何自定义拦截器。1.实现Interceptor接口在Struts2框架中,通常开发人员所编写的自定义拦截器类都会直接或间接地实现com.opensymphony.xwork2.in…

大家好,又见面了,我是你们的朋友全栈君。

实现自定义拦截器

在实际的项目开发中,虽然 Struts2 的内建拦截器可以完成大部分的拦截任务,但是,一些与系统逻辑相关的通用功能(如权限的控制和用户登录控制等),则需要通过自定义拦截器实现。本节将详细讲解如何自定义拦截器。

1.实现Interceptor接口

在 Struts2 框架中,通常开发人员所编写的自定义拦截器类都会直接或间接地实现 com.opensymphony.xwork2.interceptor.Interceptor 接口。Interceptor 接口中的主要代码如下所示:

public interface Interceptor extends Serializable{ 
   
    void init();
    void destroy();
    String intercept(ActionInvocation invocation) throws Exception;
}

从上述代码中可以看出,该接口共提供了以下三个方法。

1)void init()
该方法在拦截器被创建后会立即被调用,它在拦截器的生命周期内只被调用一次。可以在该方法中对相关资源进行必要的初始化。

2)void destroy()
该方法与 init() 方法相对应,在拦截器实例被销毁之前,将调用该方法释放和拦截器相关的资源,它在拦截器的生命周期内,也只被调用一次。

3)String intercept(ActionInvocation invocation)throws Exception

该方法是拦截器的核心方法,用于添加真正执行拦截工作的代码,实现具体的拦截操作,它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的视图资源。每拦截一个动作请求,该方法就会被调用一次。

该方法的 ActionInvocation 参数包含了被拦截的 Action 的引用,可以通过该参数的 invoke() 方法,将控制权转给下一个拦截器或者转给 Action 的 execute() 方法。

2.继承抽象类AbstractInterceptor

AbstractIntercepter 类实现了 Interceptor 接口,并且提供了 init() 方法和 destroy() 方法的空实现。使用时,可以直接继承该抽象类,而不用实现那些不必要的方法。AbstractInterceptor 类中定义的方法如下所示:

public abstract class AbstractInterceptor implements Interceptor{ 
   
    public void init(){ 
   }
    public void destroy(){ 
   }
    public abstract String intercept (ActionInvocation invocation) throws Exception;
}

AbstractInterceptor 类已经实现了 Interceptor 接口的所有方法,一般情况下,只需继承 AbstractInterceptor 类,实现 interceptor() 方法就可以创建自定义拦截器。

需要注意的是,只有当自定义的拦截器需要打开系统资源时,才需要覆盖 AbstractInterceptor 类的 init() 方法和 destroy() 方法。与实现 Interceptor 接口相比,继承 AbstractInterceptor 类的方法更为简单。

3.继承MethodFilterInterceptor

MethodFilterInterceptor提供了一个doIntercept方法供我们实现拦截器功能。


public abstract class MethodFilterInterceptor extends AbstractInterceptor { 
   
    /** * Subclasses must override to implement the interceptor logic. * * @param invocation the action invocation * @return the result of invocation * @throws Exception */
    protected abstract String doIntercept(ActionInvocation invocation) throws Exception;
    
}

示例:

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

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146536.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月14日 下午11:00
下一篇 2022年5月14日 下午11:20


相关推荐

  • recovery分区可以删除吗,recovery lmage分区

    recovery分区可以删除吗,recovery lmage分区

    2026年3月13日
    2
  • centos7系列关闭防火墙但是端口依然无法访问

    centos7系列关闭防火墙但是端口依然无法访问centos7.3系统,已经关闭firewalld,但是除了22端口,其余端口无法被外界访问,本地访问正常,解决步骤:1、先开启firewalld:systemctl start firewalld2、放通端口:firewall-cmd –zone=public –add-port=8080/tcp –permanent3、重新加载配置文件:firewall-cmd –reload此时测试,端口已经能够访问了,如果不需要firewall,可以再关闭,已放通端口不受影响(为什么一开始我不放

    2022年6月13日
    674
  • Quartus ii 软件仿真基本流程(使用VHDL)「建议收藏」

    Quartus ii 软件仿真基本流程(使用VHDL)「建议收藏」Quartusii软件仿真基本流程(使用VHDL)文章首发于我的个人博客这是VHDL系列教程的第一个教程。所谓教程,其实也就是记录我本人在学习过程中遇到的问题和学习内容的笔记,分享在这里供其他初学者参考,如果博客中出现任何错误或不严谨的地方,您可以在下方评论区指出来,您的反馈是对我最大的帮助,万分感谢。这篇博客主要介绍使用Quartusii软件进行仿真的步骤,由于是第一篇所以过程详细但有些冗余(问题不大),之后的教程应该专注于VHDL语言本身以及Quartusii的一些使用技巧。本教程将用

    2022年10月15日
    5
  • 常见的六大聚类算法

    常见的六大聚类算法1 K Means K 均值 聚类算法步骤 1 首先我们选择一些类 组 并随机初始化它们各自的中心点 中心点是与每个数据点向量长度相同的位置 这需要我们提前预知类的数量 即中心点的数量 2 计算每个数据点到中心点的距离 数据点距离哪个中心点最近就划分到哪一类中 3 计算每一类中中心点作为新的中心点 4 重复以上步骤 直到每一类中心在每次迭代后变化不大为止 也可

    2026年3月26日
    2
  • java 取余 小数_Java小数取余问题求助「建议收藏」

    java 取余 小数_Java小数取余问题求助「建议收藏」2016-09-0101:19最佳答案楼上的全不明白楼主的意思,楼主要的是算法,不是程序你们懂吗!!!我只能说你们不懂什么叫真正的算法,你们只是计算机的傀儡,我看了你们回答非常生气,高校教出来的就是这种“人才”,连算法都不懂。还不如我一高中生。严重BS楼上的,尤其是说java语言的那位。我来告诉你这个问题用递推解决首先要你承认一个公式,我是习惯pascal语言的,c++怕写错,反正只是算法,你忍…

    2022年6月6日
    48
  • html中图片自动循环滚动代码,实现长图片自动循环滚动效果[通俗易懂]

    html中图片自动循环滚动代码,实现长图片自动循环滚动效果[通俗易懂]实现思路滚动效果用实现。有个方法,可以滚动到指定位置(有滚动效果,不是直接到指定位置),不了解的看这里种定位滚动方式演示。每一个Item是一张长图,这样首尾相接滚动起来(滚到无限远)就是无限循环的效果,然后再改变滚动的速度,就可以了。{;@(){(savedInstanceState);//全屏getWindow().setFlags(WindowManager.LayoutParams.FLAG…

    2022年7月18日
    136

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号