1.拦截器介绍
1.1拦截器是什么
- 拦截器是一种动态拦截方法调用的机制,相当于过滤器;
- 拦截器是Spring框架中提供的,用来动态拦截控制器方法的执行。
1.2拦截器作用
-
拦截请求,在指定方法调用前后,根据业务需求编写处理逻辑。
在拦截器当中,通常做一些通用性的操作,比如:我们可以通过拦截器来拦截前端发起的请求,将登录校验的逻辑全部编写在拦截器当中。在校验的过程当中,如发现用户登录了(携带JWT令牌或者Token且检验合法),就可以直接放行,去访问spring当中我们编写的方法。如果校验时发现并没有登录或是非法令牌,就可以直接给前端响应未登录的错误信息。
2.拦截器使用
以下是拦截器的具体使用过程:
2.1定义拦截器
自定义拦截器:实现HandlerInterceptor接口,并重写其所有方法
@Component
public class CommonInterceptor implements HandlerInterceptor {
//目标资源方法执行前执行。 返回true:放行 返回false:不放行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法执行.... ");
// 在此处编写我们的拦截逻辑
return true;
}
//目标资源方法执行后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法执行... ");
}
//视图渲染完毕后执行,最后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法执行.... ");
}
}
注意:preHandle方法:目标资源方法执行前执行。 返回true:放行 返回false:不放行
postHandle方法:目标资源方法执行后执行
afterCompletion方法:视图渲染完毕后执行,最后执行
2.2注册配置拦截器
注册配置拦截器:实现WebMvcConfigurer接口,并重写addInterceptors方法
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
//注入自定义的拦截器对象
@Autowired
private CommonInterceptor commonInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
System.out.println("开始注册自定义拦截器...");
registry.addInterceptor(commonInterceptor) //添加拦截器
.addPathPatterns("/**") //设置拦截器拦截的请求路径( /** 表示拦截所有请求)
.excludePathPatterns("/login") //不需要拦截的路径
;
}
}
在拦截器中除了可以设置/**
拦截所有资源外,还有一些常见拦截路径设置:
拦截路径 | 含义 | 举例 |
/* | 一级路径 | 能匹配/demo,/login,不能匹配 /demo/1 |
/** | 任意路径 | 能匹配/demo,/demo/1,/demo/1/2 |
/demo/* | /demo下的一级路径 | 能匹配/demo/1,不能匹配/demo/1/2,/demo |
/demo/** | /demo下的任意级路径 | 能匹配/demo,/demo/1,/demo/1/2,不能匹配/emps/1 |
3.拦截器执行流程
-
当我们打开浏览器来访问web应用时,此时过滤器会拦截到这次请求。拦截到这次请求之后,它会先执行放行前的逻辑,然后再执行放行操作。如果是基于springboot开发的,那么放行之后是进入到spring的环境当中,也就是访问我们所定义的controller当中的接口方法。
-
Tomcat并不识别所编写的Controller程序,但是它识别Servlet程序,所以在Spring的Web环境中提供了一个非常核心的Servlet:DispatcherServlet(前端控制器),所有请求都会先进行到DispatcherServlet,再将请求转给Controller。
-
当我们定义了拦截器后,会在执行Controller的方法之前,请求被拦截器拦截住。执行
preHandle()
方法,如果返回true,就表示放行本次操作,才会继续访问controller中的方法;如果返回false,则不会放行(controller中的方法也不会执行)。 -
在controller当中的方法执行完毕之后,再回过来执行
postHandle()
这个方法以及afterCompletion()
方法,然后再返回给DispatcherServlet,最终再来执行过滤器当中放行后的这一部分逻辑的逻辑。执行完毕之后,最终给浏览器响应数据。