一、拦截器的特点
1.springmvc中的拦截器需要实现HandlerInterceptor接口。
2.拦截器与过滤器类似,但功能方向侧重点不同。过滤器是用来过滤请求参数,设置编码字符等工作;拦截器是拦截用户的请求,做请求判断处理的。
3.拦截器是全局的,可以对多个Controller进行拦截。一个项目中,可以有0个或多个拦截器,它们一起拦截用户的请求。拦截器常用在:用户登录处理,权限检查,记录日志。
二、拦截器的使用步骤
1.定义类实现HandlerInterceptor接口
2.在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在
三、拦截器的执行时间
1.在请求处理之前,也就是controller类中的方法执行之前被拦截
2.在控制器方法执行之后也会执行拦截
3.在请求处理完成后也会执行拦截器
四、使用案例
1.实现HandlerInterceptor类,重写方法
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandler(HttpServletRequest request, HttpServletResponse response,
Object obj)throws Exception{
//拦截器的preHandler()方法
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse
response,Object obj,Exception e)throws Exception {
//拦截器的afterCompletion()方法
if(mv != null){
mv.addObject("mydate",new Date());//附加一个属性
}
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object
arg2,ModelAndView arg3) throws Exception {
//拦截器的postHandle()方法
}
}
①preHandle(预处理方法)(重点)
参数:
Object handler:被拦截的控制器对象
特点:
1.返回值是boolean,当返回值为false时,请求到达拦截器截止,不会继续执行控制器里面的方法;当返回值为true时,请求可以被处理
2.方法在控制器方法之前执行,用户请求先到达此方法,相当于整个项目的入口、门户
3.在这个方法中可以获取请求的信息,验证请求时候符合要求。可以验证用户是否登录,验证用户是否有权限访问某个连接地址(url)。如果验证失败,可以截断请求,请求不能被处理;如果验证成功,可以放行请求,此时控制器方法才能执行。
②postHandle(后处理方法)
参数:
Object handler:被拦截的控制器对象
ModelAndView:处理器方法的返回值
特点:
1.方法在控制器方法之后执行
2.能够获取到处理器方法的返回值ModelAndView,可以修改ModelAndView中的数据和视图,可以影响到最后的执行结果
3.主要是对原来的结果进行二次修正
③afterCompletion(最后执行的方法)
参数:
Object handler:被拦截的控制器对象
Exception ex:程序中发生的异常
特点:
1.在请求处理完成后执行的。框架中规定当你的视图处理完成后,对视图执行了forward,就认为请求处理完成。
2.一般做资源回收工作的,程序请求过程中创建了一些对象,在这里可以删除,回收占用的内存。
2.声明拦截器
<mvc:interceptors>
<!--声明第一个拦截器-->
<mvc:interceptor>
<!--指定拦截器请求的uri地址,可以使用通配符**,这里的/**代表拦截所有文件 -->
<mvc:mapping path="/**" />
<!--声明拦截器对象 -->
<bean: class="com.demo.handler.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>