部分内容摘自开涛的《跟我学SpringMVC.PDF》

拦截器,本质类似于AOP,主要的应用场景

  1.日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV等。

  2.权限检查:如登录检测,进入处理器检测是否登录,没有登录返回登录页面。

  3.性能监控:记录拦截器进入处理器和离开处理器的时间。

  4.通用行为:读取cookie中的用户信息放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器的需要都可以使用拦截器实现。

  5.OpenSessionView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。

拦截器有两种实现方式:

1.实现拦截器处理器接口:org.springframework.web.servlet.HandlerInterceptor

  preHandle(HttpServletRequest request,HttpServletResponse response, Object handler):预处理回调方法,在Controller前执行,返回true继续执行下一个流程(interceptor或handler)。返回false中断执行,不会再调用拦截器或处理器,可以操作reponse来产生响应。

  postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView):后处理回调方法,在Controller后(渲染视图前)执行,可以通过对ModeAndView进行处理或对视图进行处理,ModeAndView可能为null

  afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex):整个请求完毕的回调方法,在视图渲染完毕时回调。 

2.继承拦截器适配器类:org.springframework.web.servlet.handler.HandlerInterceptorAdapter

  实现拦截器需要重写三个接口,拦截器适配器为这三个方法做了空实现,可以继承这个类,根据需要重写拦截器的1~3个方法。

区别:

1.拦截器适配器为拦截器接口的三个方法做了空实现,可以根据需要复写这1~3个方法。

2.拦截器适配器实现了AsyncHandlerInterceptor接口,提供afterConcurrentHandlingStarted()函数,用于处理Controller的异步请求

项目配置:

xml:

<!-- 拦截器定义 -->
<bean id="logInterceptor" class="com.wang.interceptor.LogInterceptor"/>
<bean id="performanceInterceptor" class="com.wang.interceptor.PerformanceInterceptor"/>
<bean id="testInterceptorAdapter" class="com.wang.interceptor.TestInterceptorAdapter"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
  <!-- 拦截器配置,顺序执行 -->
  <property name="interceptors">
    <list>
      <ref bean="logInterceptor"/>
  <ref bean="performanceInterceptor"/>
  <ref bean="testInterceptorAdapter"/>
  </list>
</property>
</bean>

java:

package com.wang.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 日志拦截器
* @author wlyfree
*/
public class LogInterceptor implements HandlerInterceptor{ public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.err.println("LogInterceptor preHandle");
return true;
} public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.err.println("LogInterceptor postHandle");
} public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.err.println("LogInterceptor afterCompletion");
}
}
package com.wang.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; /**
* 性能拦截器
* @author wlyfree
*/
public class PerformanceInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.err.println("PerformanceInterceptor preHandle()");
return true;
} public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.err.println("PerformanceInterceptor postHandle()");
} public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.err.println("PerformanceInterceptor afterCompletion()");
}
}
package com.wang.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class TestInterceptorAdapter extends HandlerInterceptorAdapter { @Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.err.println("TestInterceptorAdapter preHandle()");
return true;
} @Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.err.println("TestInterceptorAdapter postHandle()");
} @Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.err.println("TestInterceptorAdapter afterCompletion()");
} @Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.err.println("TestInterceptorAdapter afterConcurrentHandlingStarted()");
}
}

jsp:

<%System.err.println("index.jsp"); %>

效果:

LogInterceptor preHandle()
PerformanceInterceptor preHandle()
TestInterceptorAdapter preHandle()
deal request!
TestInterceptorAdapter postHandle()
PerformanceInterceptor postHandle()
LogInterceptor postHandle()
index.jsp
TestInterceptorAdapter afterCompletion()
PerformanceInterceptor afterCompletion()
LogInterceptor afterCompletion()

如果把TestInterceptorAdapter.java的preHandle()返回值改为return false,则效果为:

LogInterceptor preHandle()
PerformanceInterceptor preHandle()
TestInterceptorAdapter preHandle()
PerformanceInterceptor afterCompletion()
LogInterceptor afterCompletion()

分析(详情可以查看源码):

  正常流程,拦截器的preHandle()都返回true,则顺序执行:

  问题流程:

    若拦截器preHandle()返回false,则执行执行所有执行成功的拦截器的afterCompletion(),如拦截器2的preHandle()返回false

  

SpringMVC学习(五)——拦截器示例的更多相关文章

  1. SpringMVC 学习笔记(拦截器的配置))

    在设置SpringMVC的拦截器时,需要在SpringMVC中配置 拦截器对象,拦截器的的对象要 实现 HandlerInterceptor 接口 拦截器类的设置: public class inte ...

  2. SpringMVC学习 十三 拦截器栈

    拦截器栈:就是有多个拦截器同时拦截相同的控制器(controller)请求,这写拦截器就构成了拦截器栈. 栈的特点是先进后出,在拦截器栈中也是如此,如果先执行了preHandle方法,也就是意味着先进 ...

  3. Struts2基础学习(五)—拦截器

    一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...

  4. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  5. 【SpringMVC学习11】SpringMVC中的拦截器

    Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...

  6. 9.springMVC中的拦截器

    springMVC中的拦截器大概大致可以分为以下几个步骤去学习: 1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用 2.在springMVC的配置文件中添加拦 ...

  7. springMVC的全局拦截器

    先说说为什么要使用springMVC的全局拦截器,比如 当我们在访问接口的时候,我们一般都会先判断这个用户是否登陆,我们就要在每个接口的前面都要判断一下,想想是不是很蛋疼,那工作量... 这时候,我们 ...

  8. SpringMVC中的拦截器、过滤器的区别、处理异常

    1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...

  9. Struts2学习之拦截器

    © 版权声明:本文为博主原创文章,转载请注明出处 拦截器: - Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能 - 拦截器方法在Action执行之前或之后执行 工作原理: - ...

随机推荐

  1. iis+php(FastCGI)

    1. 安装 IIS 时选择添加 CGI 功能 2. 安装 PHP, 2.1 下载 nts 版本 (非线程安全版本) zip 压缩包,下载对应的 vc++ 运行时(php官网下载页面左侧有下载链接) 2 ...

  2. kafka的安装及基本使用

    1.安装zookeeper # 解压缩 [root@localhost zookeeper]# .tar.gz [root@localhost zookeeper]# zk_simple # 复制zo ...

  3. 安装vs2013要求重启后安装

    解决方案: 卸载360,然后杀毒, 重启电脑就可以直接安装vs了

  4. CSAPP阅读笔记-汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163

    1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...

  5. oracle--块信息深入解析

    一,创建 Data Block是数据库中最小的I/O单元 01,建立一个新的表空间 查看默认表空间位置 select TABLESPACE_NAME,FILE_NAME from dba_data_f ...

  6. unittest简介

    unittest是python里面的单元测试框架 1 unittest 简介 1).先导入 unittest2).用 help 函数查看源码解析3).查看描述:Python unit testing ...

  7. oracle中斜杠(/)的含义

    斜杠就是让服务器执行前面所写的sql脚本.如果是普通的select语句,一个分号,就可以执行了.但是如果是存储过程,那么遇到分号,就不能马上执行了.这个时候,就需要通过斜杠(/)来执行. 1 2 3 ...

  8. Go语言备忘录(3):net/http包的使用模式和源码解析

    本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录(3):net/http包的使用模式和源码解析,多谢!  目录: 一.h ...

  9. win10-查看wifi密码

    1:查看pc连接的wifi名称:netsh wlan show profile 2:生成xml文件:  netsh wlan export profile name= YJ-PC_Network fo ...

  10. HTTP POST上传文件说明及注意事项

    这一阵子因为项目需要要对接别家公司的restful接口,其中有一个接口是上传视频文件.接着上网找找资料.后来文件是上传成功了,但上服务器一看,文件没有后缀,我勒个去,这是什么个鬼.接着继续找资料,最终 ...