拦截器
拦截器是Spring框架提供的核心功能之一,主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码。
拦截器就像小区门口的保安一样,当有人(外部请求)想要进入小区,保安就会先验证他的身份,身份正确才会放行;再你出小区后会做一些善后工作(如:关门……)。
拦截器的使用分为两步:
- 定义拦截器
- 注册配置拦截器路径
HandlerInterceptor
自定义拦截器需要使其实现HandlerInterceptor接口并重写里面的方法。
public class Interceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return HandlerInterceptor.super.preHandle(request, response, handler); } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
preHandle: 该方法会在目标接口执行前执行。返回true表示继续执行后续操作;返回false表示拦截当前请求并中断后续操作;
postHandle:该方法会在目标接口执行后执行;
afterCompletion:该方法会在视图渲染完毕后执行,最后执行(因为后端开发现在几乎不涉及视图所以使用较少)。
WebMvcConfigurer
当我们实现了自定义拦截器后还需要注册配置拦截器路径,需要再创建一个类并令其实现WebMvcConfigurer接口,并重写addInterceptors方法,将我们自定义的拦截器交给Spring来管理,令Spring来决定执行实机;
public class Configurer implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { //添加自定义拦截器 registry.addInterceptor(new Interceptor()); } }
当我们添加完拦截器后还需要配置拦截器路径,让拦截器对特定的方法生效,而另一些方法中不生效。
public class Configurer implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new Interceptor()) //配置拦截器生效的路径(对所有路径都生效) .addPathPatterns("/**"); } }
拦截路径 | 含义 | 举例 |
/* | ⼀级路径 | 能匹配/user,/book,/login,不能匹配/user/login |
/** | 任意级路径 | 能匹配/user,/user/login,/user/reg |
/book/* | /book下的⼀级路径 | 能匹配/book/addBook,不能匹配/book/addBook/1,/book |
/book/** | /book下的任意级路径 | 能匹配/book,/book/addBook,/book/addBook/2,不能匹 配/user/login |
我们定义如下的拦截器,并编写两个方法(fun1,fun2):
public class Interceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("目标方法执行前"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("目标方法执行后"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("视图渲染完毕后"); } }
"/test") (public class Test { "/fun1") ( public void fun1() { log.info("执行fun1方法"); } "/fun2") ( public void fun2() { log.info("执行fun2方法"); } }
修改配置路径令其对fun1方法不生效
public class Configurer implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new Interceptor()) .addPathPatterns("/**") .excludePathPatterns("/test/fun1"); } }