springboot中拦截器使用
最常用的是登录时验证token。
这时我们需要WebMvcConfigurerAdapter 和 HandlerInterceptor
HandleIntercepotr: 在Spring中定义一个Interceptor是非常简单的,主要有两种方式:
第一种:实现HandlerInterceptor 接口,或者是继承实现了HandlerInterceptor 接口的类,例如HandlerInterceptorAdapter;
第二种:实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
HandlerInterceptor接口中定义了三个方法。
//该方法在处理请求之前进行调用,就是在执行Controller的任务之前。如果返回true就继续往下执行,返回false就放弃执行。 boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
//该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。 void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
//该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。用于进行资源清理。 void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
实现一个HandlerInterceptor接口进行token校验
/** * @ClassName AuthorizationInterceptor * @Description token鉴权 * @Date 2019/7/17 9:12 **/ @Component public class AuthorizationInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //验证是否有token String token = request.getHeader("token"); if(StringUtils.isEmpty(token)){ return false; }/** * .....这里可以进行token鉴权 */ return true; } }
接下来我们对WebMvcConfigurerAdapter:进行配置
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Autowired private AuthorizationInterceptor authorizationInterceptor; /** *对api路径进行拦截 **/ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**"); } }