springboot 拦截器 及 可能失效原因

  拦截器handleInterceptor是一个类似于filter的东西,不过他的拦截比filter更加精准,可以到达方法级别,拦截器的执行时间是filter之后,可以和filter同时使用,但是handleInterceptor是springMVC的内容,离开了springMVC就不好用了,建议使用filter,更具通用性。
  filter在doFilter里,可以在chain.doFliter前后做一下操作 ,chain.doFilter的最里层执行的是controll而,而在这个拦截器就是在controller前后执行,所以拦截器的执行是在filter和controller之间。
  filter在controller前后执行一些操作,拦截器相比较而言多了一个操作,拦截器有三个操作:

代码地址:https://github.com/wkcaeser/springboot-studydemo

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor1 start work");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor1 before return view");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor1 finish work");
    }

preHandle是在进入controller之前执行,postHandle是在返回model渲染视图之前执行,afterCompletion是在request执行完成后执行的。
拦截器和filter一样,有一条执行链,内部其实是个数组,现在定义的先执行。
下面再定义一个interceptor,然后注册:

public class Interceptor2 implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor2 start work");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor2 before return view");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor2 finish work");
    }
}

springboot2.0以后WebMvcConfigurerAdapter类被废弃了,改用WebMvcConfigurationSupport

@Configuration
public class WebAppConfigurer extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor2()).addPathPatterns("/");
        registry.addInterceptor(new Interceptor1()).addPathPatterns("/");
        super.addInterceptors(registry);
    }
}

通过改变注册的顺序可以看到拦截器执行顺序发生了改变。
拦截器拦截的请求路径要注意,很容易进坑,/* 拦截一级路径, /**拦截多级路径,不注意很容易出现拦截器失效的情况。
拦截器相当与包围着controller执行,所以拦截器做权限过滤、日志统计等工作是相当方便。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值