码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-11 14:33:19      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:拦截器   struts2   javaweb   methodfilterinterceptor   

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,我不要被拦截。

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

标签:拦截器   struts2   javaweb   methodfilterinterceptor   

原文地址:http://blog.csdn.net/ffm83/article/details/43733563

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!