Java 实现拦截器Interceptor的拦截功能方式

目录
  • 第1步:创建业务组件接口 BusinessFacade
  • 第2步:创建业务组件实现类 BusinessClass
  • 第3步:创建拦截器 InterceptorClass
  • 第4步:创建动态代理处理器工具 DynamicProxyHandler
  • 第5步:创建客户端 ClientDemo

Java 里的拦截器是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种可以提取 action 中可重用部分的方式。在 AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。

此外,拦截器在流行的开源框架中也很常见,其依赖的技术就是 Java 的动态代理。理解拦截器的核心原理对理解这些开源框架的体系结构至关重要。下面,我们就以一个简单的模型的来说明拦截器实现的一般方法。

模型主要分为五个模块,分别:

  • 业务组件,被代理和被拦截的对象;
  • 代理处理器,实现了InvocationHandler接口的一个对象;
  • 代理对象,Proxy对象;
  • 拦截器,普通的 Java Bean,在调用业务方法之前或者之后会自动拦截并执行自己的一些方法;
  • 客户端,执行业务处理的入口。

接下来,我们就用 Java 语言来实现拦截器Interceptor的拦截功能:

第1步:创建业务组件接口 BusinessFacade

/**
 * @author 维C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 业务组件接口
 */
public interface BusinessFacade {
    public void doSomething();
}

第2步:创建业务组件实现类 BusinessClass

/**
 * @author 维C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 业务组件接口的实现类
 */
public class BusinessClass implements BusinessFacade {
    public void doSomething() {
        System.out.println("在业务组件 BusinessClass 中调用方法: doSomething()");
    }
}

第3步:创建拦截器 InterceptorClass

/**
 * @author 维C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 拦截器
 */
public class InterceptorClass {
    // 在 action 之前调用
    public void before(){
        System.out.println("在拦截器 InterceptorClass 中调用方法: before()");
    }
    // 在 action 之后调用
    public void after(){
        System.out.println("在拦截器 InterceptorClass 中调用方法: after()");
    }
}

第4步:创建动态代理处理器工具 DynamicProxyHandler

/**
 * @author 维C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 动态代理处理器工具
 */
public class DynamicProxyHandler implements InvocationHandler {
    // 声明被代理对象
    private Object business;
    // 创建拦截器
    private InterceptorClass interceptor = new InterceptorClass();
    /**
   * 动态生成一个代理类对象,并绑定被代理类和代理处理器。
   *
   * @param business
   * @return 代理类对象
   */
    public Object bind(Object business) {
        this.business = business;
        /**
         * Proxy.newProxyInstance(参数1, 参数2, 参数3)
         *
         * 参数1, 表示被代理类的 ClassLoader
         * 参数2, 表示被代理的接口
         * 参数3, 表示代理处理器对象
         *
         * 该方法,返回代理实例
         */
        return Proxy.newProxyInstance(business.getClass().getClassLoader(),
                business.getClass().getInterfaces(),
                this);
    }
    /**
   * 代理需要调用的方法,并在该方法调用前后,先调用连接器的方法。
   *
   * @param proxy 代理类对象
   * @param method 被代理的接口方法
   * @param args 被代理接口方法的参数
   * @return 方法调用返回的结果
   * @throws Throwable
   */
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       Object result = null;
       interceptor.before();
       result = method.invoke(business, args);
       interceptor.after();
       return null;
   }
}

第5步:创建客户端 ClientDemo

/**
 * @author 维C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 客户端
 */
public class ClientDemo {
    public static void main(String args[]) {
        // 创建动态代理处理工具
        DynamicProxyHandler handler = new DynamicProxyHandler();
        // 创建业务组件对象
        BusinessFacade business = new BusinessClass();
        // 创建业务组件对象,并用动态代理绑定代理类
        BusinessFacade businessProxy = (BusinessFacade) handler.bind(business);
        // 调用业务组件中的方法,演示拦截器效果
        businessProxy.doSomething();
    }
}

运行上面的项目代码,结果如下图所示:

如上图所示,显然我们拦截器的拦截功能实现啦!

通过这篇文章,我们可能会对拦截器的实现原理有一个更透彻的理解。

But,在真正的项目实践之中,要想实现拦截器的功能,我们一般采用继承类HandlerInterceptorAdapter或者抽象类AbstractInterceptor,或者实现HandleInterceptor接口。

也就是说,我们只需要关心如何重写方法,而不需要关心其内部的实现原理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中过滤器 (Filter) 和 拦截器 (Interceptor)的使用

    1.过滤器 (Filter) 过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法. init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次.注意:这个方法必须执行成功,否则过滤器会不起作用. doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter. destroy(): 当容器销毁 过滤器

  • Spring MVC 拦截器 interceptor 用法详解

    Spring MVC-拦截器 今天就是把有关拦截器的知识做一个总结. 1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日志.判断用户是否登录等. 要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置.通常拦截器类可以通过两种方式来定义. 1.通过实现HandlerInterceptor接口,或继承Han

  • Spring MVC 拦截器实现代码

    拦截器的实现 1.编写拦截器类实现HandlerInterceptor接口: 2.将拦截器注册进springmvc框架中: 3.配置拦截器的拦截规则: 其他实现方法 WebRequestInterceptor接口: 与上一个的区别是参数区别和prehandle的方法没有返回值.没有上一个功能全,因此常用第一个. 拦截器的使用场景 处理所有请求共性问题: 1.乱码问题:用request,response参数去设置编码: 2.解决权限验证问题(是否登陆,取session对象查看): 拦截器与过滤器的

  • Mybatis Interceptor 拦截器的实现

    Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最好了解下它的原理,以便写出安全高效的插件. 拦截器(Interceptor)在 Mybatis 中被当做插件(plugin)对待,官方文档提供了 Executor,ParameterHandler,ResultSetHandler,StatementHandler 共4种,并且提示"这些类中方法的细

  • Java 实现拦截器Interceptor的拦截功能方式

    目录 第1步:创建业务组件接口 BusinessFacade 第2步:创建业务组件实现类 BusinessClass 第3步:创建拦截器 InterceptorClass 第4步:创建动态代理处理器工具 DynamicProxyHandler 第5步:创建客户端 ClientDemo Java 里的拦截器是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种可以提取 ac

  • Java拦截器Interceptor实现原理及代码示例

      1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式.在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作.目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可. 2,拦截器的原理 大部分时候,拦截器方法都是通过代理的方式来调用的.S

  • Java拦截器Interceptor和过滤器Filte的执行顺序和区别

    目录 1.实现原理不同 2.使用范围不同 3.触发时机不同 4.拦截的请求范围不同 5.注入Bean情况不同 6.控制执行顺序不同 1.实现原理不同 过滤器和拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的. 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问

  • Struts2拦截器Interceptor的原理与配置实例详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故

  • SSM项目使用拦截器实现登录验证功能

    目录 登录接口实现 拦截器类代码实现 配置文件实现 登录接口实现 public User queryUser(String UserName, String Password,HttpServletRequest request, HttpServletResponse response) { User user = userMapper.queryUser(UserName,Password); if(!StringUtils.isEmpty(user)){ //1.获取session Htt

  • AngularJS使用拦截器实现的loading功能完整实例

    本文实例讲述了AngularJS使用拦截器实现的loading功能.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="zh-CN" ng-app="myApp"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge

  • spring boot加入拦截器Interceptor过程解析

    这篇文章主要介绍了spring boot加入拦截器Interceptor过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.spring boot拦截器默认有 HandlerInterceptorAdapter AbstractHandlerMapping UserRoleAuthorizationInterceptor LocaleChangeInterceptor ThemeChangeInterceptor 2.配置spring

  • springboot拦截器Interceptor的使用,你都了解吗

    springmvc 中的拦截器可以对请求进行判别, 在请求到达控制器之前, 把非法的请求给拦截掉 下面来说一说, 它在springboot中的使用 拦截器是可以有多个的, 对不同的 url 进行拦截 我们这个例子设想的是, 如果用户登录过, 就会用户设置一个 session , 如果session中 有user 的信息,就说明用户是登录过的 1.我们先创建一个 User 的实例对象 domain public class User { private Integer id; private St

随机推荐