一 拦截器概述

  拦截器技术比较像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>

springMVC学习 十二 拦截器的更多相关文章

  1. spring boot 学习(十二)拦截器实现IP黑名单

    拦截器实现IP黑名单 前言 最近一直在搞 Hexo+GithubPage 搭建个人博客,所以没怎么进行 SpringBoot 的学习.所以今天就将上次的”?秒防刷新”进行了一番修改.上次是采用注解加拦 ...

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

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

  3. SpringMVC学习记录(七)--拦截器的使用

    SpringMVC的请求如以下这样的图所看到的: 能够看出全部的请求都要通过Dispatherservlet来接收,然后通过Handlermapping来决定使用哪个控制器,再依据ViewResolv ...

  4. SpringMVC学习笔记九:拦截器及拦截器的简单实用

    SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...

  5. SpringMVC 学习笔记(六)拦截器

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  6. springMVC学习(12)-使用拦截器

    一.拦截器配置和测试: 1)定义两个拦截器,(要实现HandlerInterceptor接口) HandlerInterceptor1: package com.cy.interceptor; imp ...

  7. SpringMVC学习08(拦截器)

    8.拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过滤器与拦截器的区别: ...

  8. SpringMVC学习笔记:拦截器和过滤器

    首先说明一下二者的区别: 1. 拦截器基于java的反射机制,而过滤器是基于函数回调 2. 拦截器不依赖于servlet容器,过滤器依赖servlet容器 3. 拦截器只能对action请求起作用,而 ...

  9. springmvc学习笔记二:重定向,拦截器,参数绑定

    Controller方法返回值 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. 返回void 在Contro ...

随机推荐

  1. bui框架nav导航图标一览

    权限  .nav-permission   仓库  .nav-storage   库存  .nav-inventory   用户  .nav-user   订单  .nav-order   商品  . ...

  2. 解决mysqli的中文乱码问题

    有时候我们向服务器传汉字,出现内容为空,或???的问题,是因为mysqli对utf8的解码属于 Unicode码,会解析为 Unicode 码:所以我们要对内设置成gbk码, 尽管gbk码,很古来,但 ...

  3. nodejs server websocket

    var WebSocketServer = require('websocket').server; var http = require('http'); var server = http.cre ...

  4. nginx+python+windows 开始_02

    接上文:http://www.cnblogs.com/tacyeh/p/4790112.html 一.改造helloWorld.py import web urls = ('/', 'Home', ' ...

  5. 获取mysql 配置和目录

    http://bbs.csdn.net/topics/390620630 mysql> show variables like '%dir%';+------------------------ ...

  6. canal 配置 详细说明

    git hub  https://github.com/alibaba/canal canal.properties介绍:https://agapple.iteye.com/blog/1831873

  7. python练习题_01

    1.执行python的两种方式 答:1.通过解释器执行1.py 2.通过cmd执行python,再执行1.py 2.简述位与字节的的关系 答:8位=1字节(计算机处理时以字节为单位,存储时以位为单位) ...

  8. 多个css样式合并到一个“目录”css文件中

    执行访问jsp后发现没有效果 同样的代码,在html中效果对比如下: 具体原因:不清楚,暂时记着~~~在jsp中不支持@import这种css样式的引用

  9. python 列表 list的基本操作

    一,Python 的列表数据类型包含更多的方法. 这里是所有的列表对象方法: list.append(x) 把一个元素添加到链表的结尾,相当于 a[len(a):] = [x] . list.exte ...

  10. oracle可重复执行脚本(添加字段)

    --添加债券期限字段 declare cn integer; begin cn := 0; select count(*) into cn from user_tab_cols t where t.t ...