springboot添加拦截器
步骤:
1、 自定义类加注解@Configuration并实现WebMvcConfigurer接口类,重写addInterceptors(){}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* springboot的拦截器写法
* 1:自定义类 实现WebMvcConfigurer
* 2:该接口中有一个api 叫做 添加拦截
*
*/
@Configuration
public class MyMvcConfigure implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
//在此方法中添加 自定义拦截器
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("addInterceptors");
// *代表拦截api下的1级目录 ** 代表拦截一级目录下的所有目录
registry.addInterceptor(loginInterceptor).addPathPatterns("/api/*/**");
// .excludePathPatterns("login");//不拦截的路径
}
}
2、 自定义拦截器类,实现HandlerInterceptor
preHandle:调用Controller某个方法之前
postHandle:Controller之后调用,视图渲染之前,若控制器Controller出现异常,则不执行此方法
afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component //交给spring容器管理
public class LoginInterceptor implements HandlerInterceptor {
//执行 controller 之前 先执行 preHandle
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true; //true代表放行 false 代表拦截
}
//controller 执行后 但还未 渲染页面 就执行 postHandle
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
//所有操作执行完毕
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
3、 将2中的自定义拦截器加入到步骤1中的addInterceptors(){}方法中。
拦截器失效原因:
1)检查是否有注解@Configuration
2)拦截路径是否有 ** 和 *
3)拦截器最后路径一定要是 “/**”, 如果是目录的话则是 /*/