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

1、 Struts2的方法拦截器概述

Struts2拦截器也可以通过MethodFilterInterceptor类实现,MethodFilterInterceptor重写了AbstractInterceptor类的intercept(ActionInvocationinvocation)方法,但提供了一个doIntercept(ActionInvocation invocation)抽象方法。从这种设计方式可以看出,MethodFilterInterceptor类的intercept已经实现了对Action的拦截行为(只是实现了方法过滤的逻辑),但真正的拦截逻辑还需要开发者提供,也就是通过回调doIntercept方法实现。可见,如果用户需要实现自己的拦截逻辑,则应该重写doIntercept(ActionInvocation invocation)方法。

实现方法过滤的拦截器与实现普通拦截器并没有太大的区别,只需要注意两个地方:实现方法过滤的拦截器需要继承MethodFilterInterceptor抽象类,并且重写doIntercept方法定义对Action的拦截逻辑。

在MethodFilterInterceptor方法中,额外增加了如下两个方法:

public void setExcludeMethods(String excludeMethods):排除需要过滤的方法——设置方法“黑名单”,所有在excludeMethods字符串中列出的方法都不会被拦截。

public void setIncludeMethods(String includeMethods):设置需要过滤的方法——设置方法“白名单”,所有在includeMethods字符串中列出的方法都会被拦截。

注意:如果一个方法同时在excludeMethods和includeMethods中列出,则该方法会被拦截。

因为MethodFilterInterceptor类包含了如上的两个方法,则该拦截器的子类也会获得这两个方法。可以在配置文件中指定需要被拦截,或者不需要被拦截的方法。

2、 开发前的准备工作

要有一个能运行的struts2环境

3、 实现继承MethodFilterInterceptor的拦截器的源代码


package com.struts2;

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

/**
 * 简单实现struts2的拦截方法的拦截器,继承MethodFilterInterceptor抽象类
 *
 * @author 范芳铭
 */
public class EasyMethodInterceptor extends MethodFilterInterceptor {

    // 简单拦截器的名字
    private String name;

    // 重写doIntercept方法,实现对Action的拦截逻辑
    public String doIntercept(ActionInvocation invocation) throws Exception {
        long start = System.currentTimeMillis();
        // 执行该拦截器的后一个拦截器,或者直接指定Action的execute方法
        //LoginAction action = (LoginAction) invocation.getAction();
        String result = invocation.invoke();
        long end = System.currentTimeMillis();

        System.out.println(name + " ,检测出本Action执行的时间为:" + (end - start) + "毫秒");
        return result;
    }

    public String getName() {
        return name;
    }

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

4、 配合测试用的Action

package com.struts2;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 简单实现的action
 * @author 范芳铭
 */
public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 7854497526623985504L;
    // 主执行方法
    public String execute() throws Exception {
        System.out.println("---LoginAction 被执行。");
        return "success";
    }

    //另外一个方法,本方法不要被拦截
    public String getExcludeMethod() throws Exception {
        System.out.println("---getExcludeMethod,我不要被拦截。");
        return "success";
    }
}

5、 配合测试的login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP ‘index.jsp‘ starting page</title>
</head>
  <body> 

<form action="aLogin.action" method="post" name="form1">
    <table width="392" border="1">
      <tr align="center">
            <td colspan="2" bgcolor="#FFCCFF"><input type="submit" value="我会被拦截 登陆" />
            </td>
        </tr>
    </table>
  </form>

  <form action="getExcludeMethod.action" method="post" name="form1">
    <table width="392" border="1">
      <tr align="center">
            <td colspan="2" bgcolor="#FFCCFF"><input type="submit" value="我  不要被拦截" />
            </td>
        </tr>
    </table>
  </form>
  </body>
</html>

6、 Struts.xm的修改

<package name="first" extends="struts-default"><!-- 定义一个package -->
    <interceptors>
        <interceptor name="MyInterceptor" class="com.struts2.EasyMethodInterceptor">
             <param name="name">我是struts2的方法拦截器</param>
              <param name="excludeMethods">getExcludeMethod</param>
        </interceptor>
        <interceptor-stack name="myInterceptorStack">
            <interceptor-ref name="MyInterceptor" />
            <interceptor-ref name="defaultStack" />
        </interceptor-stack>
    </interceptors>
    <!-- 对action返回结果的配置 -->
    <action name="aLogin" class="com.struts2.LoginAction">
        <result name="success">/index.jsp</result>
        <interceptor-ref name="myInterceptorStack"></interceptor-ref>
    </action>

    <action name="getExcludeMethod" class="com.struts2.LoginAction" method="getExcludeMethod">
        <result name="success">/index.jsp</result>
        <interceptor-ref name="myInterceptorStack"></interceptor-ref>
    </action>
</package>

上面配置文件的代码通过excludeMethods属性指定了execute方法无须被拦截,如果浏览者在浏览器中再次向login的Action发送请求,在Tomcat控制台将看不到任何输出,表明该拦截器没有拦截Action的execute方法。如果需要同时指定多个方法不被该拦截器拦截,则多个方法之间以英文逗号(,)隔开。

7、 运行结果

启动中间件,输入 http://127.0.0.1:8080/webStudy/login.jsp

看到两个提交按钮,从上往下点击,后台输出:

—LoginAction 被执行。

我是struts2的方法拦截器 ,检测出本Action执行的时间为:134毫秒

—getExcludeMethod,我不要被拦截。

时间: 2024-08-24 11:56:21

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

struts2 参数注入 方法拦截器

web.xml: <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://java.sun.com/xml/ns/javaee"

在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

Struts2中过滤器和拦截器的区别

拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器 :是在面向切面编程的就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比

好记性不如烂笔头86-spring3学习(7)-ApplicationContext中bean的生命周期

假设使用ApplicationContext来生成.管理Bean, 一个Bean从建立到销毁,会历经几个运行阶段. 我个人理解一般的bean的生命周期主要包含:建立,初始化,使用阶段,销毁四个核心阶段.使用ApplicationContext 和BeanFactory对bean的生命周期来看,宏观上基本同样,微观上有一些差异. 假设使用ApplicationContext来生成并管理Bean.在运行BeanfactoryAware的 setBeanFactory()阶段之后.若Bean类上有实现

好记性不如烂笔头85-spring3学习(6)-BeanFactory 中bean的生命周期

如果使用BeanFactory来生成.管理Bean, 一个Bean从建立到销毁,会历经几个执行阶段. 我个人理解一般的bean的生命周期主要包括:建立,初始化,使用阶段,销毁四个核心阶段. 1.@Bean的建立 由BeanFactory读取Bean定义文件,并生成各个Bean实例. 2.初始化@属性注入 执行相关的Bean属性依赖注入 @BeanNameAware的setBeanName() org.springframework.beans.factory.BeanNameAware @Bea

Python学习中的随笔,好记性不如烂笔头

本文 为博主看了 vamei 的blog 写下的随笔 . 致敬Vamei 1.type()   可以显示参数的类型 如 : a=12   type(a) 为 int 2.python的基本类型 为 int float bool string   如 int :  i=1   ,   float :  f=12.5  ,  bool : b= True  or  Flase , string :  s='Hello , word !' 使用前无需声明类型  即 动态类型 3.1序列有 tuple

开篇记(好记性不如烂笔头)

入园两年零三个月,我居然没有一点东西记载下来实在是不应该. 爷爷曾经告诉过我,好记性不如烂笔头.他告诉了我最鲜明的例子.爷爷的脑子一直很好用,记性也是比常人好上一些,当然这也直接导致了爷爷的性格很是高傲.爷爷年轻的时候喜欢舞文弄墨什么的,所以呢每逢人家红白喜事的时候都会去人家及里面瞅上一眼,看看人家送上的喜联或者挽联.有此爱好的还有我的一个另一个宋爷爷,他们经常约好一起的.爷爷老是自信于强悍的记忆能力,每次都是记在脑子中,而宋爷爷却每次都将那些很好的对联记载一个小本子上面.如今爷爷年纪越来越大,

好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)

Java中自带的动态代理的类必须要实现一个接口,而且据说使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高. 那么我们测试下,这个运行的效率如何. 1. 测试的准备情况 准备1:好记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1) http://blog.csdn.net/ffm83/article/details/

好记性不如烂笔头89-spring3学习(10)-spring3常用schema(持续整理)

Spring3有很多的schema,这些schema对应很多不同的功能.使用这些常用的schema,能让我们避免重复发明轮子,提高我们的开发效率. 我以为这是一个很常见的信息,到网上随便整理下就能完成,可能用的关键词不对,怎么找也没有找到相对比较全面的. 正所谓,好记性不如烂笔头,自己动手把自己能收集到的整理下来,以后需要找资料也能方便点. spring-beans-3.0.xsd 用途:spring3最主要的schema,用于配置bean 命名空间: http://www.springfram