SpringBoot 配置过滤器和拦截器

引言

回顾一下基础,过滤器和拦截器,过滤器更早执行,拦截器在mvc层,后执行

image.png

代码

过滤器

@Configuration
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 如果需要拦截,可以重定向到其它页面
        chain.doFilter(request,response); // 请求放行
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

拦截器

MVC注册拦截器

@Configuration
public class WebMvcConfigure implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor());
    }
}

拦截器主要内容

@Configuration
public class Interceptor implements HandlerInterceptor {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 请求执行之前,返回值true为放行
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

思考

过滤器和拦截器的使用时机?

正如开篇的那张图,拦截器可以使用容器中的bean,而过滤器不行,要考虑业务需求
如果处理的是DispatcherServlet之前,只能用过滤器
如果处理的是控制器前后,拦截器过滤器都可以

过滤器和拦截器的区别

过滤器基于函数回调,拦截器基于反射机制
过滤器依赖servlet容器,拦截器不依赖servlet容器
过滤器可对所有请求过滤,拦截器只能对指定的起作用,实际上也是顺序问题。
拦截器可以访问action的上下文,而过滤器不可以

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。