作者:禅楼望月

默认情况下,我们为一个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内置的支持方法过滤的拦截器有:

欢迎转载,请注明出处

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

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

    AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. SpringBoot中AOP的使用 ...

  2. struts2中的方法过滤拦截器

    方法过滤拦截器是只过滤指定的方法,如果使用针对action 的普通的过滤器则会过滤该action内部 所有方法.如果在一个action中同时有多个作为业务逻辑控制的方法存在 的话则会过滤所有的业务逻辑 ...

  3. Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法

    Spring3系列10- Spring AOP——Pointcut,Advisor 上一篇的Spring AOP Advice例子中,Class(CustomerService)中的全部method都 ...

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

    AOP的本质还是动态代理对方法调用进行增强. SpringBoot 提供了方便的注解实现自定义切面Aspect. 1.使用需要了解的几个概念: 切面.@Aspect 切点.@Pointcut. 通知. ...

  5. struts2复习(五)拦截器总结

    1. 拦截器(Interceptor): 拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的. 2. 拦截器的配置 1)编写实现Interceptor 接口的类.  2)在s ...

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

    前言: 前面介绍了Spring的核心模块以及相关的依赖注入等概念.这篇讲解一下spring的另一个重点,AOP面向切面编程. 说道AOP不得不提到几个概念: 切面:也就是我们自己的一些业务方法. 通知 ...

  7. AOP通知无法切入指定方法

    AOP通知,切入指定方法时拦截不到,可能是拦截的方法本身是被本类的其他方法调用的,根据AOP反射原理是无法拦截本类中方法调用的方法的.如: class AImpl implements AIf { s ...

  8. struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证

    struts2.xml 内容 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  9. struts2 javaweb 过滤器、监听器 拦截器 原理

    转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...

随机推荐

  1. ETO的公开赛T1《矿脉开采》题解(另类版)

    这道题别看是签到题,写起来一点不简单 出题人的正解是双向搜索 我们把物品分成两半 每一半分别跑搜索 答案存下来,用个双指针合并即可 然后我构造了两组数据卡掉了他,不得不缩小数据范围 但我这里为什么要致 ...

  2. CF1042A 【Benches】(优先队列)

    这是一道良心的cf题 题意里让你求的是来了m个人后人数最多的长椅上最少和最多有多少人 如果要求最多,很好办,m个人都挤到原来人数最多的长椅上了(一眼看出) 但如果要求最少呢? 大家看图 长椅某个时间的 ...

  3. [JSOI2010]Group 部落划分 Group

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3661  Solved: 1755[Submit][Status][Discuss] Descripti ...

  4. MySQL 字符串函数:字符串截取

    1.left(name,4)截取左边的4个字符 列: ,) 年 结果:2018 2.right(name,2)截取右边的2个字符 ,) 月份 结果:09 3.SUBSTRING(name,5,3) 截 ...

  5. MySql指令的执行顺序

    1:From 2:On 3:Join 4:Where 5:Group by 5.1:函数 6:Having 7:Select 8:Distinct 9:Order by

  6. ECSHOP和SHOPEX快递单号查询国际EMS插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  7. Oracle数据库之 PL SQL 学习笔记

    1.定义基本变量: 2.引用型的变量: set serveroutput on   declare pename emp.ename%type; psal emp.sal%type;   begin ...

  8. CopyArrays

    import java.util.Arrays; public class CopyArrays { public static void main(String args[]) { int []a ...

  9. TRANSLATE(转换大/小写并替换字符)

    可以将字母 转换大/小 写或使用替 换规则. 要转换大/小 写,请使用 TRANSLATE 语句,用法 如下: 语法 TRANSLATE <c> TO UPPER CASE. TRANSL ...

  10. ASP.NET MVC文件上传【转】

    最近用到了文件上传功能,下面给出ASP.NET MVC文件上传的一个简单示例: 一.前端代码 @using (Html.BeginForm("UploadFile", " ...