一 拦截器概述

  拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能。但是和Spring中的Aop技术是由区别的。AOP 在特定方法前后扩充(一般是对 ServiceImpl的方法进行扩充),而拦截器是对控制器的请求进行拦截。

  但是拦截器和java web的过滤器也是有区别的,拦截器只能拦截控制器的请求,对jsp和静态资源不拦截,因为拦截器是SpingMVC的技术,SpringMVC的总入口是DispatcherServlet,我们在配置DsipatcherServlet时,就已经把DispatcherServlet可以接收的请求限定为Controller的请求。而Java Web中的 Filter 可以拦截任何请求。

二 实现自定义拦截器

第一步:创建一个拦截器类,并继承HandlerInterceptor接口

在HandlerInterceptor接口中有三个方法

(1)preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)

执行时间:控制器之前执行
如果返回值为true,则放行到控制器,
如果返回值为false,直接返回,不放行,
一般情况下,如果不放行,一般会sendRedirect("")让其跳转到一个特定的页面, arg2:要拦截的控制器的方法

(2)postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception

执行时间:控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法
arg3:模型和视图
功能:一般用来记录日志,或者敏感词过滤
structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的

(3)afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception 

执行时间:执行完jsp之后才执行

根据arg3参数是否为null来判断是否出现了异常
无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常

package com.ssm.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class DemoInterceptor implements HandlerInterceptor{ /**
* 控制器之前执行,如果返回值为true,则放行到控制器,如果返回值为false,直接返回,不放行,一般情况下,如果不放行,一般会sendRedirect("")
* 让其跳转到一个页面
* arg2:要拦截的控制器的方法
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("preHandle方法执行了");
return true;
}
/**
* 控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法
* arg3:模型和视图
* 功能:一般用来记录日志,或者敏感词过滤
* structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle 方法执行了");
System.out.println(arg3.getViewName());
System.out.println(arg3.getView()); System.out.println(arg3.getModel().get("modelKye")); }
/**
* 执行完jsp之后才执行
*
* 根据arg3参数是否为null来判断是否出现了异常
* 无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion方法执行了"); } }

三 配置拦截器,就像Filter一样,拦截器也需要配置

在SpringMVC的配置文件中进行配置,有两种配置方式,一种是拦截所有请求,第二种是拦截特定请求。

下面的代码是拦截所有请求,拦截特定请求的被注释了

<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 表示所有的控制器请求都拦截 -->
<bean class="com.ssm.interceptor.DemoInterceptor"></bean>
<!-- 拦截特定请求 -->
<!-- <mvc:interceptor>
<mvc:mapping path="/demo"/>
<bean class="com.ssm.interceptor.DemoInterceptor"></bean>
</mvc:interceptor> -->
</mvc:interceptors>

最新文章

  1. Fragment调用Activity
  2. 在Excel里用vba给合并的单元格添加注释
  3. html的基础标签
  4. EasyUI中Treegrid节点的删除
  5. solaris安装oracle遇INS 30131 错误
  6. Js获取标签高度
  7. Hibernate拦截器(Interceptor)与事件监听器(Listener)
  8. Rustlang语言逐行处理文件的基本方法
  9. ASP.NET MVC---自定义HtmlHelper方法
  10. TC SRM683 Div1 250
  11. C#委托、事件、线程
  12. 把H5打包成IOS APP其实可以很简单!签名?越狱?都不需要!
  13. cmd Telnet 手工模拟http请求
  14. k8s(6)-滚动更新
  15. BZOJ 1037: [ZJOI2008]生日聚会Party(区间dp)
  16. DataTable 作为ObjectDataSource的数据源
  17. System.exit(0)会跳过finally块的执行
  18. 使用innerHTML时要注意的一点
  19. js ~取非运算符的妙用,将-1转为0(或假值)
  20. maven项目中没有resource文件夹的问题

热门文章

  1. keil5 MDK 链接报错 Error: L6410W 解决
  2. JVM学习总结(一):Java内存区域
  3. synchronized 实现同步的基础
  4. centos7 安装percona-toolkit工具包的安装和使用
  5. [ExcelHome]VLOOKUP的别样用法
  6. centos7将可执行程序做成服务
  7. 虚拟机安装centOs+网络配置(完整说明)
  8. leetCode21: 合并两个有序列表
  9. idea本地跑代码和链接开发机设置
  10. wireshark抓本地回环包