• SpringBoot自定义拦截器(多个拦截器)


    在 Spring Boot 中要实现自定义拦截器需要实现 HandlerInterceptor 接口,并重写 preHandle、postHandle 和 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
    public class MyInterceptor implements HandlerInterceptor {
    
        /**
         * @return 返回 true 放行、放回 false 拦截
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("进入拦截器,前置通知" + request.getRequestURI());
            //过滤掉 确认的 options 请求
            if ("OPTIONS".equals(request.getMethod())) {
                return true;
            }
    
            String token = request.getHeader("token");
    
            if (token != null) {
                return true;
            }
    
            return false;
        }
    
        @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("最终通知");
        }
    }
    
    

    然后实现 WebMvcConfigurer 接口重写 addInterceptor方法:

    @Configuration
    public class MyConfig implements WebMvcConfigurer {
    
        @Autowired
        MyInterceptor myInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
    
            registry.addInterceptor(myInterceptor)    // 添加自定义拦截器
                    .excludePathPatterns("/index") // 设置放行路径
                    .addPathPatterns("/**");       // 设置拦截路径
            
            // 如果有多个拦截器,继续添加即可
            //registry.addInterceptor(myInterceptor2)    
            //       .excludePathPatterns("/index") 
            //        .addPathPatterns("/**");       
        }
    }
    

    多个拦截器的执行顺序如下:(盗一张图)
    image.png
    最先执行 preHandle 的拦截器的 postHandleafterCompletion 都是最后执行的

  • 相关阅读:
    ReSharper Tips—GotoImplementation
    Possible multiple enumeration of IEnumerable
    Hello, Razor!
    自话自说——POI使用需要注意一个地方
    css中怎么设置透明度的问题
    记录排查国标直播流播放卡顿的问题
    互联网上做广告的优点
    C#、.Net经典面试题集锦(一)
    什么是MFC
    C/S与B/S 的区别
  • 原文地址:https://www.cnblogs.com/Fzeng/p/16254775.html
Copyright © 2020-2023  润新知