SpringBoot的拦截器
1、注册拦截器: @Configuration
SpringBoot2.X 新版本配置拦截器 implements WebMvcConfigurer
2、自定义拦截器 HandlerInterceptor
preHandle:调用Controller某个方法之前
postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
3、按照注册顺序进行拦截,先注册,先被拦截
结构图:
注册拦截器: RegisterWebMvcConfigurer
package com.example.newdemo.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 配置规则:WebMvcConfigurer接口中写方法的哦!
* jdk8之后就会在
*/
@Configuration
public class RegisterWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自定义的拦截器哦! (指定路径需要拦截哦)
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/we/*/**");
registry.addInterceptor(new UserInterceptor());
//调用父类的拦截器继续Go
WebMvcConfigurer.super.addInterceptors(registry);
}
}
自定义拦截器 (2个)
/**
* 自定义拦截器
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
/**
* 进入controller层之前 拦截请求
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("---> preHandle LoginInterceptor");
//获得请求的数据
// String users =request.getParameter("name");
// response.getWriter().print("fail!!!");
return true;
}
/**
* 调用完controller之后,视图渲染之前
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("---> postHandle LoginInterceptor");
//调用父类的
HandlerInterceptor.super.postHandle(request,response,handler,modelAndView);
}
/**
* 整个完成之后,通常用于资源清理
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("---> afterCompletion LoginInterceptor");
HandlerInterceptor.super.afterCompletion(request,response,handler,ex);
}
}
测试控制:
效果:
总之,就能看出单个拦截器的执行顺序.
1. 在控制器方法执行之前, 执行的 preHandle 方法
2. 执行控制器的inter1方法
3. 执行完inter1, 解析view之前(如果有的话), 执行拦截器的 posthandle 方法
4. 解析view
5. 解析完之后, 执行 afterCompletion 方法
注意要点:
拦截器不生效常见问题:
1)是否有加@Configuration
2)拦截路径是否有问题 ** 和 *
3)拦截器最后路径一定要 “/**”, 如果是目录的话则是 /*/