最近在写项目的时候,为了后期网站的维护方便,想要通过一些方法进行权限的控制。但是在写的项目有并不是一个十分大型的网页,不需要直接导SpringSecurity进行权限控制(这样太麻烦了)。但是如果每次请求都验证请求者是否已经登录,Controller和Service里面代码有会显得比较臃肿。所以最后我选用了拦截器进行权限的控制,该拦截器必须实现HandlerInterceptor接口。当然,拦截器不仅仅可以进行权限的控制,由于具有拦截请求进行操作的特性,它往往也能做到很多请求的预处理。
preHandle()方法
这个方法在业务处理器处理请求之前被调用,SpringMVC 中的Interceptor是链式调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
postHandle()方法
这个方法在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。
afterCompletion()方法
该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。afterCompletion方法被调用的方向和perHandle也是相反的,先声明的Interceptor的afterCompletion方法后执行。
SSM使用拦截器
SSM框架下,一切的Spring的对象(包括拦截器)都需要被Tomcat扫描并识别到,所以拦截器首先要在配置文件里面进行注册。配置文件中可以标明该拦截器拦截的路径为哪些,不拦截的路径为哪些。
当然,不用担心静态资源会不会被拦截(图片,js文件等),配置文件中有加这么一句话:mvc:default-servlet-handler/,都会放行静态资源的。
SpringBoot使用拦截器
SpringBoot下的对象可以用配置文件注册,也可以用配置类(@Configuration)。当然首先建议用配置类,简单直观,易于修改。首先需要定义好拦截器,用@Component进行bean的添加,然后再配置类中(继承WebMvcConfigurerAdapter类,该类是专门管理MVC配置的类,虽然最新版本的SpringBoot已经将其过时了),重写addInterceptors(InterceptorRegistry registry)方法,即将拦截器加入到拦截器链中。当然也可以进行拦截路径,排除路径的指定。
随便一提,SpringBoot默认静态资源的路径为/**,也就是静态资源都不会拦截,拦截器中为了稳妥起见,最好排除一下静态资源的路径,避免项目开发麻烦。
评论区