3.拦截器
一个拦截器的执行;
项目:interceptor。
自定义拦截器
拦截器:
(1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。
(2)拦截器是拦截用户的请求,做请求判断处理的。
(3)拦截器是全局的,可以对多个Controller做拦截
一个项目中可以有0个或多个拦截器,它们在一起拦截用户的请求
拦截器常用在:用户登录处理,权限检查,记录日志。
拦截器的使用步骤:
1.定义类实现HandlerInterceptor接口
2.在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。
拦截器的执行时间:
1)在请求处理之前,也是controller类中的方法执行之前先被拦截
2)在控制器方法执行之后也会执行拦截器
3)在请求处理完成后也会执行拦截器
perHandler:
postHandler:
afterCompletion:
package com.bjpowernode.handler;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
/**
* @Description: 拦截器类:拦截用户的请求
* @Author : Jerry
* @create : 2022-04-19 17:28
*/
public class MyInterceptor implements HandlerInterceptor {
private long btime = 0;
/**
*
* preHandle 预处理方法
* 参数:
* Object handler:被拦截的控制器对象
* 返回值:boolean
* true:请求是通过了拦截器的验证,可以执行处理器方法。
* 拦截器的MyInterceptor的preHandle()执行
* ===执行MyController指定的doSome方法===
* 拦截器的MyInterceptor的postHandle()执行
* 拦截器的MyInterceptor的afterCompletion()执行
* false:请求没有到达拦截器的验证,请求到拦截器就截止了。请求没有被处理
* 拦截器的MyInterceptor的preHandle()执行
*
* 特点:
* 1.方法在控制器方法(MyController的doSome)之前先执行的
* 用户的请求先到达此方法
* 2.在这个 方法中可以获取请求的信息,验证请求是否符合要求。
* 可以验证用户是否登录,验证用户是否有权限访问某个链接地址(url)
* 如果验证失败,可以截断请求,请求不能被处理。
* 如果验证成功,可以放行请求,此时控制器方法才能执行。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
btime = System.currentTimeMillis();
System.out.println("拦截器的MyInterceptor的preHandle()执行");
//给浏览器一个返回结果
request.getRequestDispatcher("/tips.jsp").forward(request, response);
return false;
}
/**
* postHandle 后处理方法。
* 参数:
* Object handler:被拦截的控制器对象
* ModelAndView mv:处理器方法的返回值
* 特点:
* 1.在处理器方法返回之后执行的(MyController.doSome())
* 2.能够获取到处理器方法的返回值ModelAndView,可以影响到ModelAndView
* 中的数据和视图,可以影响到最后的执行结果
* 3.主要对原来的执行结果做二次修正,
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv){
System.out.println("拦截器的MyInterceptor的postHandle()执行");
//对原来的doSome执行结果,需要调整。
if(mv!=null){
//修改数据
mv.addObject("mydate", new Date());
//修改视图
mv.setViewName("other");
}
}
/**
* afterCompletion:最后执行的方法
* 参数:
* Object handler:被拦截的控制器对象
* Exception ex: 程序中发生的异常
* 特点:
* 1.在请求处理完成后执行的。框架中规定是你的视图处理完成之后,对视图执行了forward。就认为请求处理完成
* 2.一般做资源回收工作的,程序中创建了一些对象,在这里可以删除,把占用的内存回收
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
System.out.println("拦截器的MyInterceptor的afterCompletion()执行");
long etime = System.currentTimeMillis();
System.out.println("计算从preHandle到请求处理完成的时间:"+(etime-btime));
}
}
声明多个拦截器;
在框架中保存多个拦截器是ArrayList,
按照声明的先后顺序放入到ArrayList
多个拦截器的执行图:
过滤器和拦截器的区别:
1.过滤器是servlet中的对象,拦截器是框架中的对象
2.过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的
拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前先执行的。
5.过滤器是tomcat服务器创建的对象
拦截器是springmvc容器中创建的对象
6.过滤器是一个时间点
拦截器有三个执行时间点
7.过滤器可以处理jsp,js,html等等
拦截器是侧重拦截对Controller 的对象。
如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容
8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应