过滤器与拦截器若同时存在,先执行过滤器的放行前,再执行整个拦截器,最后再执行过滤器的放行后
过滤器会拦截所有资源(包括静态资源),拦截器只会拦截Spring环境的资源
Filter的使用
1、创建一个类implements Fliter接口中的doFilter方法(init,destroy默认实现)
2、在该类上添加@WebFilter注解 (urlPatterns = “/配置拦截路径”)
3、在spring boot启动类上加上@ServletComponentScan注解扫描Servlet组件
4、doFilter方法中使用FilterChain的doFilter方法可以放行拦截请求,因此放行之前的操作写在FilterChain的doFilter方法之前,放行之后访问到对应资源后,还会回到doFilter方法执行放行后的代码,因此放行后的操作写在FilterChain的doFilter方法之后
多个filter的执行顺序是按照filter类的类名Abc…
拦截器的定义与注册
定义:
1、实现HandlerInterceptor接口并加上注解@Component
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
//目标资源方法运行前执行,返回true:放行,返回false:不放行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
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 {
}
}
注册:
1、实现WebMvcConfigurer接口并重写addInterceptors()方法
2、声明为一个配置类@Configuration
3、将定义的拦截器注册
@Configuration//声明为一个配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/**")//拦截所有资源
.excludePathPatterns("/login");//不需要拦截的资源
}
}