Spring boot 配置自己的拦截器

框架使用的是spring boot 2.0

首先,自定义拦截器实现HandlerInterceptor接口,preHandler是在执行controller方法前执行的  此外还有两个方法,具体作用最后才说,先熟悉以下拦截器的使用流程。

 @Component
public class PassportInterceptor implements HandlerInterceptor{ @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
User user = (User)session.getAttribute("user");
if(user == null) {
response.sendRedirect("/login");
return false;
}
return true;
} }

上面拦截器只是简单的通过session验证是否登录

定义了自己的拦截器后就要实现 WebMvcConfigurer接口 注:该接口好像是spring boot 2.0以后有的  之前不是这个接口 该接口提供了方法添加拦截器,加上@Component注解  让其能被ioc容器管理

 @Component
public class LabWebConfiguration implements WebMvcConfigurer{ @Autowired
PassportInterceptor passportInterceptor; @Override
public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(passportInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/stylesheets/**", "/javascripts/**","/fonts/**",
"/images/**", "/login/**", "/regist/**");
} }

registry有三个重要的方法,addInterceptors()方法将自定义的拦截器添加进去 addPathPatterns 方法的主要作用是添加拦截器要拦截的路径,excludePathPatterns的功能则是配置对某些路径放行。上面我针对自己的静态资源、还有登录注册页面放行

Spring boot 配置自己的拦截器

接下来做一个小小的测试  测试以下拦截器各个方法的执行顺序

 @Controller
public class TestController { @RequestMapping("/test")
@ResponseBody
public String testInterceptor() { System.out.println("Controller方法执行"); return "test";
} }
 @Component
public class TestInterceptor implements HandlerInterceptor{ @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandler执行了");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandler执行了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("afterCompletion执行了");
} }
 @Component
public class LabWebConfiguration implements WebMvcConfigurer{
@Autowired
TestInterceptor testInterceptor; @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor)
.addPathPatterns("/test");
} }

结果如下

Spring boot 配置自己的拦截器

可见preHander方法只在Controller执行前   return true则放行

postHandler则是在 具体的Controller方法执行后执行

afterCompletion  看资料说是在页面渲染完成后执行   因此可以用来作为资源的清理工作

上一篇:Oracle不连续的值,如何实现查找上一条、下一条


下一篇:springmvc+spring+mybatis+maven项目构建