Struts2拦截指定方法的拦截器

作者:禅楼望月

默认情况下,我们为一个Action配置一个拦截器,该拦截器会拦截该Action中的所有方法,但是有时候我们只想拦截指定的方法。为此,需要使用struts2拦截器的方法过滤特性。

要使用struts2拦截器的方法过滤特性其实也很简单,只需让拦截器的实现类继承com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类。该类是AbstractInterceptor的子类。它重写了AbstractInterceptor类的intercept(ActionInvocation invocation)方法,并提供了protected abstract String doIntercept(ActionInvocation invocation) throws Exception方法。拦截器的实现类只需重写该方法即可。

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.stbc.web.Action.LoginAction;

public class InterceptorHello extends MethodFilterInterceptor {
    private static final long serialVersionUID = -5407269431454126006L;

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest request=ServletActionContext.getRequest();
        if(request.getParameter("username").equals("毛爷爷")){
            return "error";
        }else {
            request.setAttribute("datetime", new Date());
            LoginAction action=(LoginAction) invocation.getAction();
            return action.execute();
        }
    }
}

从上面的代码可以看出,我们自定义的拦截指定方法的拦截器和普通的拦截器没有太大的区别,只不过是继承的类和重写的方法不同而已。

那么我们怎么来实现一些方法不拦截而另一些方法拦截呢?

查看MethodFilterInterceptor类的API可知:

在Action中配置也很简单,它也是通过反射的技术来实现的。

<package name="loginPackage" extends="struts-default"  namespace="/login">
    <interceptors>
        <interceptor name="interceptormaoyeye" class="test.InterceptorHello">
            <param name="name">你好!</param>
        </interceptor>
    </interceptors>
    <action name="login" class="com.stbc.web.Action.LoginAction">
        <result name="success">welcome.jsp</result>
        <result name="error">welcome.jsp</result>
        <interceptor-ref name="interceptormaoyeye">
            <!-- 这里使用了反射的方法,实际上调用的是拦截器类的setName方法 -->
            <param name="name">覆盖了默认值</param>
            <!-- 有多个方法需要(不)被拦截器拦截,则多个方法名之间用逗号分隔即可。 -->
            <param name="excludeMethods">method1,method2</param>
            <param name="includeMethods">method2,method3</param>
        </interceptor-ref>
    </action>
</package>

上述代码将method2配置为既不给拦截也被拦截,这是struts2以<param name="includeMethods">的为准。

struts2内置的支持方法过滤的拦截器有:

欢迎转载,请注明出处

时间: 2024-08-02 18:52:32

Struts2拦截指定方法的拦截器的相关文章

SpringBoot —— AOP注解式拦截与方法规则拦截

AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. SpringBoot中AOP的使用方式主要有两种:注解式拦截与方法规则拦截,具体使用如下文所示. 一.创建一个简单springboot 2.03项目,添加aop依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId

struts2复习(五)拦截器总结

1. 拦截器(Interceptor): 拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的. 2. 拦截器的配置 1)编写实现Interceptor 接口的类. 2)在struts.xml文件里定义拦截器. 3)在action中使用拦截器 3. 一旦定义了自己的拦截器,将其配置到action上后,我们须要在action的最后加上默认的拦截器栈:defaultStack. 4. 定义拦截器时能够直接继承AbstractInterceptor抽象类(该类实现了Interc

【Spring开发】—— AOP之方法级拦截

前言: 前面介绍了Spring的核心模块以及相关的依赖注入等概念.这篇讲解一下spring的另一个重点,AOP面向切面编程. 说道AOP不得不提到几个概念: 切面:也就是我们自己的一些业务方法. 通知:用于拦截时出发的操作. 切点:具体拦截的某个业务点. 这样说可能还是有点抽象,举个例子,下面是一个纸糊的多面体. 每个面都是一个业务方法,我们通过刺穿每一个面,都可以进入到内部,这个面就是一个切面. 刺穿的时候会发出声响,这就是一种通知. 而具体从哪个面刺入,这就是一个切入点的选择了. 这样说,应

好记性不如烂笔头50-javaWeb框架struts2中的方法拦截器(5)

1. Struts2的方法拦截器概述 Struts2拦截器也可以通过MethodFilterInterceptor类实现,MethodFilterInterceptor重写了AbstractInterceptor类的intercept(ActionInvocationinvocation)方法,但提供了一个doIntercept(ActionInvocation invocation)抽象方法.从这种设计方式可以看出,MethodFilterInterceptor类的intercept已经实现了

struts2进阶【6】——拦截器

小解拦截器 可以说,"拦截器"是Struts2的重点内容.见名知义,拦截器的作用主要就是拦截东西,拦截什么呢?当然是'action'了,在执行'action'之前 拦截器会起作用,执行一些预先处理的代码,接着去执行action中相关的方法,之后,流程又会回到拦截器里面,接着去执行后续的一些操作. 在这里还要提两点: 1. Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack).Struts2拦截器栈就是将拦截器按一定的顺序联结成

Struts2学习第三天——拦截器与文件传输

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.15 lutianfei none 内容摘要: 1.国际化(了解) 2.拦截器(Interceptor)-重点 3.struts2文件上传与下载(次重点) 4.ognl与valuestack 国际化 国际化原理,什么是国际化 ? 同一款软件 可以为不同用户,提供不同语言界面 -- 国际化软件 需要一个语言资源包(很多properties文件,每个properties文件 针对一个国家或者语言 ,通过java程序根

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

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

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

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

spring mvc 方法注解拦截器

应用场景,在方法级别对本次调用进行鉴权,如api接口中有个用户唯一标示accessToken,对于有accessToken的每次请求可以在方法加一个拦截器,获得本次请求的用户,存放到request或者session域. python中,之前在python flask中可以使用装饰器来对方法进行预处理,进行权限处理 先看一个实例,使用@access_required拦截: @api.route('/post_apply') @access_required def apply():     "&q