符合条件的请求被放行,不符合条件的请求访问不到所请求的东西。
1、步骤
(以登陆拦截器为例,只有用户登录了才能访问某页面):
1、编写拦截器,实现HandlerInterc此接口有三个方法 ,
preHandler:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返 回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法。在此方法终编写拦截逻辑
postHandle:控制器方法执行之后执行postHandle()
afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
2、拦截器注册到容器中( WebMvcConfigurer接口的addInterceptor方法)
3、制定拦截规则
addPathPatterns指定要拦截的路径,一般是整个工程
excludePathPatterns指定放行的路径,如静态资源等
2、源码探究:
1、获取拦截器链
1、HandlerExecutionChain:处理器执链,包含handler和Interceptor链。
根据当前请求,找到可以处理的handler,
2、可以处理该请求的handler是IndexController中的mainPage方法
3、InterceptorList拦截器链,包括自己编写的拦截器和系统拦截器
2、具体处理每一个拦截器
顺序遍历拦截器链中的拦截器,执行preHandler方法,
若当前拦截器返回为true则顺序执行下一个拦截器,
若当前拦截器返回为false,则逆序执行之前拦截器的afterCompletion。
即当任何一个拦截器失败,其后的拦截器都不会执行。
所拦截器都放行时,执行目标方法,之后倒序执行所有拦截器的postHandler方法
以上所有步骤有任何异常,都会触发相应的afterCompetition
之后进行页面渲染
页面成功渲染后,也会倒序触发afterCompetition
3、综上: