1 自定义一个拦截器
springboot与spring一样,通过实现HandlerInterceptor
接口来自定义一个拦截器,HandlerInterceptor
里有3个方法
- preHandle:拦截的功能在这个方法实现,该方法会返回一个布尔值,若为true则放行,将请求传递给下一个拦截器,若为false则拦截,需要在返回前将请求进行转发或重定向,否则页面不会跳转
- postHandle:该方法在Controller处理完请求后,且在视图渲染前调用,可以通过ModelAndView对模型视图进行处理
- afterCompletion:该方法在视图渲染完成后调用,可用于打印日志、回收资源等
@Component
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入TestInterceptor拦截器");
if (放行判断条件){
//放行前操作
return true;
}
//进行拦截,并转发到首页
request.getRequestDispatcher("/index").forward(request, response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//进行模型视图的一些处理
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//打印日志
//回收资源
}
}
2 自定义MVC配置添加拦截器
通过实现WebMvcConfigurer
接口或继承WebMvcConfigurationSupport
接口,并重写addInterceptors方法添加拦截器
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
TestInterceptor testInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor)
.addPathPatterns("/**") // 需要拦截的路径
.excludePathPatterns("/login", "/index"); // 上面拦截的路径中需要排除的路径,如登录页或验证登录的controller
}
}
需要注意的是,在配置多个拦截器时,拦截的顺序时根据添加的先后顺序进行拦截,而回调方法的调用顺序则是相反的