`
liulanghan110
  • 浏览: 1064572 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA拦截器原理及Struts2扩展

    博客分类:
  • JAVA
阅读更多

java拦截器的基本原理其实非常简单,说白了就是动态代理类。
下面来看一个简单的例子
首先,我建立一个拦截器的类InterceptorClass,这里的before()和after()方法是以后拦截器会执行的方法
CODE清单一:

public class InterceptorClass {
	public void before() {
		System.out.println("拦截器InterceptorClass方法调用:before()!");
	}

	public void after() {
		System.out.println("拦截器InterceptorClass方法调用:after()!");
	}
}

 

我们模拟一个业务组件接口BusinessInterface,和一个业务组件实现类BusinessClass
CODE清单二:

public interface BusinessInterface {
	public void doSomething();
}

 

CODE清单三:

public class BusinessClass implements BusinessInterface {
	public void doSomething() {
		System.out.println("业务组件BusinessClass方法调用:doSomething()");
	}
}

 

然后,创建一个动态代理类DynamicProxyHandler,这个类是集成InvocationHandler接口的,动态类的原理实际上是使得当你执行一个动态方

法的时候,他可以把这个动态方法dispatch到这个动态类上来。这样,你就可以在这个方法的前后嵌入自己的一些方法。
CODE清单四:
//包含了业务对象绑定动态代理类的处理,并实现了InvocationHandler接口的invoke方法

package com.test.Interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyHandler implements InvocationHandler{
  private Object business;//被代理对象
  private InterceptorClass inceptor = new InterceptorClass();//拦截器
  
  // 动态生成一个代理类对象,并绑定被代理类和代理处理器
  public Object bind(Object business) {
    this.business = business;
    return Proxy.newProxyInstance(
      //被代理类的ClassLoader
      business.getClass().getClassLoader(),
      //要被代理的接口,本方法返回对象会自动声称实现了这些接口
      business.getClass().getInterfaces(), 
      //代理处理器对象
      this);
  }
  
 // 代理要调用的方法,并在方法调用前后调用连接器的方法
 /**
  * @param proxy
  *            代理类对象
  * @param method
  *            被代理的接口方法
  * @param args
  *            被代理接口方法的参数
  * @throws Throwable
  */
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  Object result = null;
  inceptor.before();
  result = method.invoke(business, args);
  inceptor.after();
  return result;
 }
}

 

OK,我们来写个类测试一下

public static void main(String[] args) {
   //生成动态代理类实例
   DynamicProxyHandler handler = new DynamicProxyHandler();
   //生成待测试的业务组件对象
         BusinessInterface business = new BusinessClass();
         //将业务组件对象和动态代理类实例绑定
         BusinessInterface businessProxy = (BusinessInterface) handler.bind(business);
         //用动态代理类调用方法
         businessProxy.doSomething();
}

 来看看结果:

 近期struts2很流行,而且拦截器是struts2里面一个比较好的功能,下面举个例子说明一下拦截器在struts2中的用法。
struts2对拦截器实现做了一个封装,使得我们在实现的时候比较简单。
首先我们要建一个拦截器类

public class AuthorizationInterceptor extends AbstractInterceptor {
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map session = invocation.getInvocationContext().getSession();
		String userName = (String) session.get("userName");
		if (userName != null && userName.equals("test")) {
			System.out.println("拦截器:合法用户登录---");
			return invocation.invoke();
		} else {
			System.out.println("拦截器:用户未登录---");
			return Action.LOGIN;
		}
	}
}

 

这个类是必须要继承struts2包中提供的AbstractInterceptor类,这个类有一个抽象方法intercept,这个方法是必须要实现的。
那么经理在这个拦截器里面写了一个简单的实现,对url用户合法性做了一个限制。

接下来比较关键的是过滤器在struts2中的配置,先看看代码

<package name="system" extends="struts-default">
  <interceptors>
   <!--  定义权限控制拦截器  -->
   <interceptor name="authority" 

class="com.sharesin.biz.common.intercepts.struts2.AuthorizationInterceptor"/>
   <!-- 定义一个包含权限控制的拦截器栈   -->
   <interceptor-stack name="mystack">
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <interceptor-ref name="authority"></interceptor-ref>
   </interceptor-stack>
  </interceptors>
   <!--定义默认拦截器   -->
        <default-interceptor-ref name="mystack" />
   <!--定义全局处理结果   -->
  <global-results>
   <result name="login">index.jsp</result>
  </global-results>
  <action name="login_*" class="com.sharesin.biz.web.system.LoginAction" method="{1}">
   <result name="success">system/homepage.jsp</result>
  </action>
 </package>

 在interceptors节点里,我们可以定义多个拦截器,这里的名为authority的只是其中的一个。struts2的拦截器栈我是先执行struts2默认的拦

截器defaultStack,然后再执行我的。然后只需要用default-interceptor-ref标签设置好这个system包中的默认拦截器为这个拦截器就OK了。

struts2中引入了package这个概念,我觉得十分实用,当然这对struts2拦截器也是个实惠,我们可以根据不同的action来分包和不同的拦截器


ok,来运行测试一下。

 

  • 大小: 11.8 KB
分享到:
评论

相关推荐

    struts 拦截器,扩展,以及java annotation

    struts 拦截器,扩展,以及java annotation 这个是我学习所用,放在此处,作为中转。

    Struts2 in action中文版

    4.3 研究内建的Struts 2拦截器 67 4.3.1 工具拦截器 67 4.3.2 数据转移拦截器 67 4.3.3 工作流拦截器 69 4.3.4 其他拦截器 72 4.3.5 内建的拦截器栈 73 4.4 声明拦截器 74 4.4.1 声明独立的拦截器和拦截器栈 74 ...

    struts2讲义_吴峻申

    4.1 拦截器在Struts2中的缺省应用 47 4.2 拦截器原理实现 50 4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的...

    Struts2+hibernate+spring的常见面试题

    Struts2的核心组成部分是Action,拦截器和结果页。 Struts2提供了许多方法来创建Action类,并通过struts.xml中或通过注释进行配置。我们可以创建自己的拦截器实现常见任务。 Struts2中自带了很多的标签,并使用...

    Struts2技术内幕:深入解析Struts架构设计与实现原理

    在核心实现篇中,通过源码解析,帮助广大开发者从Struts 2自身的设计原理上去掌握Web层开发的要点,如数据、动作、拦截器、视图、Plugin、配置、过程;最佳实践篇介绍了一些在实战中提炼出来的针对Struts 2的扩展和...

    struts项目学习笔记

    基于AOP(面向切面编程)思想的拦截器机制,更易扩展(不修改源代码的条件下,增强代码功能) 更强大、更易用输入校验功能 整合Ajax支持:json插件 Struts2的今生前世: 1.早期开发模型Servlet+JSP+JavaBean显得...

    深入浅出Struts2(附源码)

    本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    Struts 2 是Java Web 应用首选的MVC 框架。《深入浅出Struts2》对Struts 2 的工作机理进行了透彻的阐述。书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写...

    Java Web程序设计教程

    6.1.2拦截器及拦截器栈的应用 111 6.1.3自定义拦截器 115 6.2类型转换器 117 6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3...

    jcaptcha4struts2:从 code.google.compjcaptcha4struts2 自动导出

    通过在您的操作(处理验证码输入)中扩展提供的基本操作类,或通过配置拦截器来启用 JCaptcha 支持。 ##2。 在您的应用程序中启用 JCaptcha 支持 有两种方法可以让您的应用程序使用此插件使用 JCaptcha。 从提供的 ...

    Java面试宝典2020修订版V1.0.1.doc

    12、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 60 13、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类...

    JFinal(JAVA 极速WEB ORM框架 ) v3.2.zip

    AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅218K,且无第三方依赖 ...

    Java极速开发JFinal

    AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅248K,且无第三方依赖

    JAVA 极速WEB+ORM框架 JFinal

    AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅538K

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    JFinal 是基于 Java 语言的极速 WEB + ORM 框架,.rar

    AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅339K,且无第三方依赖 ...

    JFinal-基于 Java 语言的极速 WEB + ORM 框架

    AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅218K,且无第三方依赖

    宿舍管理系统

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

Global site tag (gtag.js) - Google Analytics