java-过滤器、拦截器

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAeG1oLXN4aC0xMzE0,size_6,color_FFFFFF,t_70,g_se,x_161.1面向对象编程(OOP)、面向切面编程(AOP)

 

面向对象编程:

 

将需求功能划分为不同的、相对独立的和封装良好的类,使他们有属于自己的行为,依靠继承和多态等来定义彼此的关系。

 

 

 

面向切面编程:

 

将通用需求功能从不相关的类中分离出来,使很多类共享一个行为,一旦发生变化,只需修改这个行为即可。

 

 

 

http://blog.csdn.net/small_mouse0/article/details/62895790这个例子解释的比较容易理解。

 

1.2 Java反射机制

反射概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

 

反射机制的作用:

 

1,反编译:.class-->.java

 

2,通过反射机制访问java对象的属性,方法,构造方法等;

 

反射机制的类:

 

(Java反射相关的API在包java.lang.reflect中。)

 

java.lang.Class;                

 

java.lang.reflect.Constructor; java.lang.reflect.Field;        

 

java.lang.reflect.Method;

 

java.lang.reflect.Modifier;

 

反射就是把Java的各种成分映射成相应的Java类。

 

1.3 过滤器和拦截器的区别

  ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。

 

  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

 

  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

 

  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

 

  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

 

⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

 

 

 

1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

 

 

 

    @Override

 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

 

        System.out.println("before...");

 

        chain.doFilter(request, response);

 

        System.out.println("after...");

 

    }

 

 

 

  chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的。

 

  

 

2.拦截器是被包裹在过滤器之中的。

 

 

 

    @Override

 

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

 

        System.out.println("preHandle");

 

        return true;

 

    }

 

    @Override

 

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

 

        System.out.println("postHandle");

 

    }

 

    @Override

 

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

 

        System.out.println("afterCompletion");

 

    }

 

 

 

  a.preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之间执行。

 

  b.preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。

 

  c.afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之间执行。

 

 

 

3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的,大致画了个图:其实非常好测试,自己写一个过滤器,一个拦截器,然后在这些方法中都加个断点,一路F8下去就得出了结论。

 

 

 

 

 

2.拦截器Interceptor

拦截器依赖的技术就是Java的动态代理。

 

2.1 模型分为以下模块

  业务组件:是被代理和被拦截的对象。

 

  代理处理器:实现了InvocationHandler接口的一个对象

 

  代理对象:Proxy对象。

 

  拦截器:普通的JavaBean,在调用业务方法的之前或者之后会自动拦截并执行自己的一些方法。

 

客户端:执行业务处理的入口。

 

2.2 模型的实现

 一、业务组件:分为业务接口和业务

 

/**

 

  * 业务组件接口

 

  */

 

  public interface BusinessInterface {

 

  public void doSomething();

 

  }

 

  /**

 

  * 业务组件

 

  */

 

  public class BusinessClass implements BusinessInterface{

 

  public void doSomething() {

 

  System.out.println("业务组件BusinessClass方法调用:doSomething()");

 

  }

 

  }

 

 

 

 

 

二、代理处理器:包含了业务对象绑定动态代理类的处理,并实现了InvocationHandler接口的invoke方法。

 

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 interceptor = new InterceptorClass(); //拦截器

 

 

 

  /**

 

  * 动态生成一个代理类对象,并绑定被代理类和代理处理器

 

  * @param business

 

  * @return 代理类对象

 

  */

 

  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 被代理接口方法的参数

 

  * @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; //To change body of implemented methods use File | Settings | File Templates.

 

  }

 

  }

 

 

 

三、拦截器:普通的JavaBean,在调用业务方法的之前或者之后会自动拦截并执行自己的一些方法。

 

  /**

 

  * 拦截器

 

  */

 

  public class InterceptorClass {

 

  public void before(){

 

  System.out.println("拦截器InterceptorClass方法调用:before()!");

 

  }

 

  public void after(){

 

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

 

  }

 

  }

 

 

 

四、模拟客户端:执行业务处理的入口。

 

  /**

 

  * 客户端

 

  */

 

  public class Client {

 

  public static void main(String args[]) {

 

  DynamicProxyHandler handler = new DynamicProxyHandler();

 

  BusinessInterface business = new BusinessClass();

 

  BusinessInterface businessProxy = (BusinessInterface) handler.bind(business);

 

  businessProxy.doSomething();

 

  }

 

  }

 

2.3 SpringMVC中使用Interceptor拦截器

一、定义Interce

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值