作者:禅楼望月

默认情况下,我们为一个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. jQuery 切换图片(图标)效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. SVN 命令整理

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.35/pro/domain 如果开 ...

  3. FROM_UNIXTIME

    FROM_UNIXTIME 格式化MYSQL时间戳函数   函数:FROM_UNIXTIME作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示.语法 ...

  4. 2.5 进程控制之wait函数

    一.绪论 一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果 是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是 ...

  5. DSP+ARM多核异构开发环境SYSLINK搭建OMAPL138

    DSP+ARM多核异构开发环境搭建OMAPL138 注意: 环境为Ubuntu 12.04 只能是这个环境.我甚至在Ubuntu16.04上面安装了VMware,然后,在装了一个Ubuntu 12.0 ...

  6. Python学习 :六个标准数据类型

    一.Numbers(数字类型) 数字类型主要分为两种—— 整数(Integer)与 浮点数(Float) 整数分为整型和长整型(在Python3中已经不再区分为整型与长整型,统一称为整型) 注意:数字 ...

  7. Manacher(马拉车)学习笔记

    Manacher可以有效的在\(O(n)\)时间内解决一个字符串的回文子串的题目 目录 简介 讲解 推介 简单的练习 恐怖的练习QAQ 小结 简介 开头都说了,Manacher是目前解决回文子串的最有 ...

  8. Scala Tuple

    Python中的Tuple 元组将多样的对象集合到一起,元素不能修改,通过索引进行查找, 使用括号"()" 允许重复 Scala中的Tuple 概念跟Python是完全相同的 定义 ...

  9. java练习题——类与对象

    一.请依据代码的输出结果,自行总结Java字段初始化的规律 public static void main(String[] args) { InitializeBlockClass obj=new ...

  10. 【转】手把手教你:Ubuntu14+apache2+django1.7+python2.7下网页/网站部署

    本人亲自尝试了网上众多的部署网页/网站方法,绝大多数都未能试验成功,这次的项目光部署这块遇到了很多问题,大概耗费了我一个星期. 本着:王道论坛中的赠人玫瑰,手留余香的精神.我把自己一路所走的历程发布出 ...