拦截器和过滤器

本文详细对比了拦截器和过滤器在Spring MVC中的使用,包括它们的执行顺序、功能差异和应用场景。拦截器主要用于登陆验证、权限检查、日志记录等,而过滤器则适用于请求预处理和响应后处理。两者执行顺序为:过滤器 -> 拦截器 -> 控制器。同时,拦截器能访问IOC容器,过滤器则不能。了解何时使用拦截器或过滤器对于提升应用程序的效率至关重要。
摘要由CSDN通过智能技术生成

拦截器和过滤器

对比

1 过滤器只能在容器初始化被调用一次,而action周期中,拦截器可以被多次调用。

2 过滤器对所有请求起作用,拦截器只能对action起作用。

3 过滤器不能访问上下文,堆栈的对象。

4 过滤器依赖于servlet容器

5 过滤器基于函数回调,拦截器基于java反射。

6 过滤器不能获取ioc容器的bean,拦截器可以,拦截注入service,可以调用业务逻辑。

执行顺序

filter–interceptor.preHandle–handler–interceptor.postHandle–interceptor.afterCompletion–filter

拦截器
@Component
public class SampleInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("\n已经进入拦截器");
        return true;

        //return HandlerInterceptor.super.preHandle(request, response, handler);
    }

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

        System.out.println("控制器执行完毕");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("得到结果"+response);
        System.out.println("请求完毕\n");
    }
}
配置类
public class InterceptorConfig implements WebMvcConfigurer {

    @Autowired
    SampleInterceptor sampleInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(sampleInterceptor).addPathPatterns("*/**").excludePathPatterns("/**/LoginController/**","/**/error")
                .excludePathPatterns("/error");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

拦截器场景

面向切面编程,符合横切关注点的功能都可以放在拦截器使用

登陆验证

权限验证

日志记录 记录请求操作日志,统计请求访问量。

处理cookie

性能监控,监控处理时长。

执行顺序考量

先定义拦截器先执行。

还可以通过order方法设置执行顺序,值越小越先执行。

过滤器

servlet的一个组件,实现用户访问某个资源前,对访问请求和响应进行过滤。

原理

基于函数回调,一个过滤器实例只能在容器初始化调用一次。

与拦截器区别

不能获取ioc容器的bean

Filter>>interceptor>>controllerAdvice>>aspect>>controller

实现过滤器方法

注解方式
@Order(2)
@WebFilter(filterName = "sampleFilterAnnotation",urlPatterns = {"/study/interfaces/v1/user/*"})
public class SampleFilterAnnotation implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化filter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入过滤器前做的事");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("处理返回的response");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器被销毁");
    }
}

上面的参数,自行百度。

最后

配置完以上,需要在启动类加一个扫描包的注解,开启包扫描。

工具的使用学一下都很快,在什么场景下,怎么使用,这才是需要花费心思去琢磨的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值