拦截器
拦截器说明:
1 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口
2 拦截器和过滤器类似,功能方向侧重点不同。过滤器是用来过滤请求参数,设置编码字符集等。
拦截器是拦截用户的请求,可以对多个Controller做拦截。
3 拦截器是全局的,可以对多个Controller做拦截。
一个项目中可以有0个或多个拦截器,他们在一起拦截用户的请求。
拦截器常用在:用户登录处理,权限检查,记录日志。
1
2
3
4
5
6
拦截器的使用步骤:
1 定义普通类实现HandlerInterceptor接口,实现接口的三个方法
2 在springmvc文件中,声明拦截器,指定拦截请求的uri地址
1
2
拦截器的执行时间:
1 在请求处理之前,也就是controller类中方法执行之前先被拦截
2 在控制器方法执行之后也会执行拦截器
3 在请求处理完成后也会执行拦截器
1
2
3
在主配置文件sprinmvc.xml中,声明拦截器
<!--声明拦截器:拦截器可以有0个或者多个-->
<mvc:interceptors>
<!--声明一个拦截器-->
<mvc:interceptor>
<!--
指定拦截请求的uri地址
path:就是uri地址,可以使用通配符 **
**:表示任意字符,文件或者多级目录中的文件
-->
<mvc:mapping path="/**"/>
<!--声明拦截器对象-->
<bean class="com.zh.handler.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
创建一个MyInterceptor.java,作为拦截器类,继承自HandlerInterceptor,实现三个方法:preHandle,postHandle,afterCompletion
preHandle:预处理方法(重要)
预处理方法:preHandle
重要:是整个项目的入口,门户
当preHandle返回true,请求可以被处理
当preHandle返回false,请求到此方法就截止
参数:Object handler:被拦截的控制器对象
返回值:boolean
true:请求通过拦截器验证,可以处理拦截器方法
控制台显示结果:
MyInterceptor拦截器的preHandle()方法执行了!
MyController控制器的doSome()方法执行!
MyInterceptor拦截器的postHandle()方法执行了!
MyInterceptor拦截器的afterCompletion()方法执行了!
false:请求没有通过拦截器的验证,请求到达拦截器就截止了。请求没有被处理
控制台显示结果:
MyInterceptor拦截器的preHandle()方法执行了!
特点:
1、该方法在控制器方法(MyController的doSome)之前执行,用户请求首先到达该方法
2、在该方法中可以获取请求的信息,验证请求是否符合要求。可以验证用户是否登录,验证用户是否有权访问某个连接地址(url),
如果验证失败,可以截断请求;如果验证成功,可以放行请求,此时控制器方法才能执行
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
MyInterceptor.java
//拦截器类:看作是多个控制器中公用的功能,集中到拦截器统一处理,使用的是aop思想(面向切面编程)。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor拦截器的preHandle()方法执行了!");
return true;
}
/*
* 后处理方法:postHandle
* 参数:
* Object handler:被拦截的处理器对象MyController
* ModelAndView mv:处理器方法的返回值
*
* 特点:
* 1、在处理器方法(MyController.doSome)之后执行
* 2、能够获取到处理器方法的返回值ModelAndView,可以修改ModelAndView中的数据和视图,会影响到最后的输出结果
* 3、主要是对原来的执行结果做第二次修正
* */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
System.out.println("MyInterceptor拦截器的postHandle()方法执行了!");
}
/*
* 最后执行方法:afterCompletion
* 参数:
* Object handler:被拦截的处理器对象
* Exception ex:程序中发生的异常
* 特点:
* 1、在请求处理完成后执行。框架中规定是你的视图处理完成后,对视图执行了forward。就认为请求处理完成。
* 2、一般做资源回收,程序请求中创建的一些对象,在这里删除,回收占用的内存
*
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor拦截器的afterCompletion()方法执行了!");
}
}
1