1.概念

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

目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可。

2.Spring拦截器

spring中拦截器主要分两种,一个是HandlerInterceptor,一个是MethodInterceptor。

2.1 HandlerInterceptor

public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception; void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception; void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}

HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行。

使用HandlerInterceptor步骤:

  1. 实现一个HandlerInterceptor拦截器可以直接实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。
  2. 在springMVC配置文件中配置拦截器

代码实例:

public class HandlerInterceptorDemo implements HandlerInterceptor {

    @Override
public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("--------HandlerInterceptor.preHandle---------");
return true;
} @Override
public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("--------HandlerInterceptor.postHandle---------");
} @Override
public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("--------HandlerInterceptor.afterCompletion---------");
}
}
<mvc:interceptors>
<!-- 在这里配置拦截器将对所有请求都拦截,公共拦截器可以有多个 -->
<mvc:interceptor>
<!-- 对/test进行拦截 -->
<mvc:mapping path="/test"/>
<!-- 特定请求的拦截器只能有一个 -->
<bean class="com.xzh.HandlerInterceptorDemo" />
</mvc:interceptor>
</mvc:interceptors>

测试结果:

2.2 MethodInterceptor

public interface MethodInterceptor extends Interceptor {
Object invoke(MethodInvocation var1) throws Throwable;
}

MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,即使不是controller中的方法。

使用MethodInterceptor步骤:

  1. 实现MethodInterceptor接口,或利用AspectJ的注解
  2. 在spring配置文件中配置

代码实例:

@Component
public class MethodInterceptorDemo implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("-------MethodInterceptorDemo.invoke--------");
Method method = methodInvocation.getMethod();
System.out.println("-------method:"+ method.getName() + "-------");
return methodInvocation.proceed();//该方法不调用,则被拦截的方法不会被执行
}
}
<aop:config>
<!--切入点-->
<aop:pointcut id="methodPoint" expression="execution(* com.xzh.*Controller.*(..)) "/><!--在该切入点使用自定义拦截器-->
<aop:advisor pointcut-ref="methodPoint" advice-ref="methodInterceptorDemo"/>
</aop:config>

测试结果:

3.拦截器与过滤器区别

  1. filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
  2. 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
  3. Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  6. 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的:

最后看一下《Spring源码深度解析》对拦截器和过滤器的区别描述:

参考:

Java三大器之拦截器(Interceptor)的实现原理及代码示例

谈谈spring中的拦截器interceptor

spring方法拦截器 MethodInterceptor 配置

拦截器和过滤器的区别

JavaWeb—拦截器Interceptor的更多相关文章

  1. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  2. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  3. SSM-SpringMVC-33:SpringMVC中拦截器Interceptor讲解

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 拦截器Interceptor: 对处理方法进行双向的拦截,可以对其做日志记录等 我选择的是实现Handler ...

  4. 过滤器(Filter)和拦截器(Interceptor)

    过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求 ...

  5. 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别

    1.Servlet:运行在服务器上可以动态生成web页面.servlet的声明周期从被装入到web服务器内存,到服务器关闭结束.一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作 ...

  6. Flume 拦截器(interceptor)详解

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  7. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

  8. Kafka producer拦截器(interceptor)

    Producer拦截器(interceptor)是个相当新的功能,它和consumer端interceptor是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于 ...

  9. Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行

    在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRun ...

随机推荐

  1. 获取Oracle隐含參数信息

    Oracle数据库的初始化參数.主要来源于两个Oracle内部数据字典表:X$KSPPCV和X$KSPPI通常我们查询的V$Parameter视图或使用show parameter命令都是就来源于这两 ...

  2. [ci]安装配置jenkins及其插件

    后面尝试ms模式部署多台jenkins 安装jenkins:(hudson是jenkins的商业版) cd /etc/yum.repos.d/ wget http://pkg.jenkins.io/r ...

  3. shell脚本之read工具

    #!/bin/bash # -*- coding: utf-8 -*- # echo -n "please input your name: " read name echo &q ...

  4. fzu 2250 不可能弹幕结界 分析+模拟,考察思维严谨。

    Problem 2250 不可能弹幕结界 Accept: 5    Submit: 13Time Limit: 1000 mSec    Memory Limit : 65536 KB Problem ...

  5. UTF-8和GBK的区别

    GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准).GBK编码专门用来解决中文编码的,是双字节的.不论中英文都是双字节的. UTF-8编码是用以解决国际上字符的一种 ...

  6. golang解析json

    解析json,在很多语言都是很常用的,go提供了相应的包"encoding/json"来处理.直接上代码,如下: package main import ( "encod ...

  7. Eclipse 创建 Java 包

    打开新建 Java 包向导 你可以使用新建 Java 包向导来创建 Java 包.Java 包向导打开方式有: 通过点击 "File" 菜单并选择 New > Package ...

  8. c语言之linux下gettimeofday函数windows替换方案

    * Copyright (C) 2008 mymtom (mymtom@hotmail.com) * All rights reserved. * * Redistribution and use i ...

  9. retrival and clustering: week 2 knn & LSH 笔记

    华盛顿大学 <机器学习> 笔记. knn k-nearest-neighbors : k近邻法 给定一个 数据集,对于查询的实例,在数据集中找到与这个实例最邻近的k个实例,然后再根据k个最 ...

  10. poj 2112(二分+多重匹配)

    题目链接:http://poj.org/problem?id=2112 思路:由于要求奶牛走的最远距离的最短路程,显然我们可以二分距离,如果奶牛与挤奶器的距离小于等于limit的情况下,能够满足,则在 ...