什么是拦截器

拦截器通常一般指的是通过拦截从浏览器发往服务器的一些请求来完成某些功能的一段程序代码
一般在一个请求发生之前,发生时,发生后我们都可以对请求进行拦截

拦截器可以做什么

拦截器可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等

自定义拦截器

可以通过继承Spring框架中的HandlerInterceptorAdapter类,然后重写preHandle,postHandle,afterCompletion三个方法,在三个方法中写我们自己要想实现的业务逻辑代码.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* 自定义拦截器
* @author admol
*/
public class MyInterceptor extends HandlerInterceptorAdapter {
/**
* 在请求之前执行
* @param request
* @param response
* @param handler 表示被拦截的请求目标
* @return false:拦截请求,终止请求 true:继续执行请求
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//业务逻辑代码编写...(如:解决乱码,权限验证)
request.setCharacterEncoding("utf-8");
return true;
} /**
* @param modelAndView 可以对视图进行操作
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
//业务逻辑代码编写...(如:操作日志记录,更改视图信息)
} /**
* @param ex 异常
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
//业务逻辑代码编写...(如:,资源销毁,异常处理)
}
}

a) public boolean preHandle(HttpServletRequest request,HttpServletResponse response,
Object handler) throws Exception
该方法在action执行前执行,可以实现对数据的预处理,比如:编码、防重复提交安全控制等。
如果方法返回true,则继续执行action。返回false则拦截请求

b) public void postHandle(HttpServletRequest request,HttpServletResponse response,
Object handler,ModelAndView modelAndView) throws Exception
该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。

c) public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。

注册拦截器

在xml文件中配置:

1
2
3
<mvc:interceptors>
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
</mvc:interceptors>

当有多个拦截器的时候可以写多个bean
当我们只想拦截部分指定请求时:

1
2
3
4
5
<mvc:interceptors>
<!-- path:需要拦截的请求,不写时会拦截所有请求 -->
<mvc:mapping path="/*.htm" />
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
</mvc:interceptors>

多个拦截器

xml配置:

1
2
3
4
<mvc:interceptors>
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
<bean id="myInterceptor2" class="com.admol.web.MyInterceptor2" />
</mvc:interceptors>

当配置有多个拦截器的时候,会按拦截器顺序执行preHandle方法,然后再倒序执行postHandle和afterCompletion方法。

其他实现方式

  1. 实现接口 implements HandlerInterceptor
  2. 实现接口 implements WebRequestInterceptor
    注册拦截器方法不变

与过滤器的区别

1.过滤器是依赖于Servlet容器,基于回调函数,Intercepto依赖与框架,基于反射机制
2.过滤器的过滤范围更大,还可以过滤一些静态资源,拦截器只拦截请求

SpringMVC中拦截器的使用的更多相关文章

  1. springmvc中拦截器与springmvc全局异常处理器的问题

    最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...

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

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

  3. springmvc中拦截器配置格式

    对于springmvc,有两种方式配置拦截器. 一是实现HandlerInterceptor接口,如 public class MyInterceptor1 implements HandlerInt ...

  4. springmvc中拦截器的定义和配置

    package com.hope.interceptor;import org.springframework.lang.Nullable;import org.springframework.web ...

  5. springmvc的拦截器

    什么是拦截器                                                         java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...

  6. SpringMVC利用拦截器防止SQL注入

    引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题.小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要.而这些网站的背后,则 ...

  7. SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】

    注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...

  8. SpringMVC 学习-拦截器 HandlerInterceptor 类

    一.拦截器 HandlerInterceptor 类的作用 SpringMVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 二.怎么使用呢? 1. ...

  9. shiro中拦截器机制

    8.1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com ...

随机推荐

  1. 1.Python3标准库--前戏

    Python有一个很大的优势便是在于其拥有丰富的第三方库,可以解决很多很多问题.其实Python的标准库也是非常丰富的,今后我将介绍一下Python的标准库. 这个教程使用的书籍就叫做<Pyth ...

  2. git清除用户名密码

    问题: remote: HTTP Basic: Access deniedfatal: Authentication failed for 'http://******** 解决方案: git con ...

  3. vue的data用到this问题

    问题:在vue中用vue-awesome-swiper,在data中初始化,用到swiper一个方法onTap,然后再调vue的一个函数,用到this,可是... data() { return { ...

  4. redis之(十四)redis的主从复制的原理

    一:redis主从复制的原理,步骤.   第一步:复制初始化 --->从redis启动后,会根据配置,向主redis发送SYNC命令.2.8版本以后,发送PSYNC命令. --->主red ...

  5. TP-LINK路由器设置内网的一台电脑在外网可以远程操控

    1.[IP和MAC绑定]--[静态ARP绑定设置]对MAC和IP进行绑定 2.[转发规则]--[DMZ主机],选择启用并把刚才设置的内网IP填入 3.直接访问路由器的外网IP就可以直接访问绑定的MAC ...

  6. Java学习笔记(十二)——eclipse和SVN配置,导入SVN服务器项目

    [前面的话] 北京的天气外加自己的不小心终于病了,在病的过程中,感觉身体好着真好,可以学习,可以吃好吃的,可以去运动,这一病了,干什么都感觉没有力气,身体好着真好. 这个文章的背景是:领导把项目最开始 ...

  7. [水煮 ASP.NET Web API2 方法论](12-3)OData 查询

    问题 Web API 怎么支持通用的 OData 系统查询项,例如 $select 或 $filter. 解决方案 为了在 Web API 中启用查询项,我们需要在 Action 上使用 Enable ...

  8. vue-music 关于Player (播放器组件)--播放模式

    播放器播放模式有三种,顺序播放,单曲循环,随机播放,定义在vuex 中的字段为 mode.点击切换播放模式的图标.切换模式判断是否为随机播放,如果是随机播放模式,则取得sequenceList 列表数 ...

  9. ZOJ 1610.Count the Colors-线段树(区间染色、区间更新、单点查询)-有点小坑(染色片段)

    ZOJ Problem Set - 1610 Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting s ...

  10. FFT实现高精度乘法

    你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...