我们是否在 Spring 中提供了拦截器链接?

Do we have provision for interceptor chaining in Spring?

假设我们有两个拦截器 "LogInterceptor" 和 "AuthInterceptor"。 第一个拦截器记录传入的请求,第二个拦截器对其进行身份验证。 目的:链接 LogIntercptor 和 AuthInterceptor。首先,我希望调用 logInterceptor,然后执行 AuthInterceptor。 注意:我知道 "redirect" 并返回 false(请不要建议那个)

---------------------Log Interceptor---------------------------------------







    //First Inteceptor

    @Component
    public class LogInterceptor extends HandlerInterceptorAdapter
    {
        private final Logger Logger = 
        LoggerFactory.getLogger(this.getClass());
        @Override
        public boolean preHandle(HttpServletRequest request, 
         HttpServletResponse response, Object handler) throws Exception {

            //take action base on incoming IP
            long startTime = System.currentTimeMillis();
            request.setAttribute("startTime",startTime); 
            if(request.getRemoteAddr().startsWith("192")) 
                 {
                response.sendRedirect("/auth-failed"); //redirect to default
                return false;
            }
            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
        {



        }
      }

//第二个拦截器"Code is however not complete, I am just seeeking how this can be achieved." class 授权拦截器 {

    }

您只需要确保在配置 InterceptorRegistry 时将 Interceptor 添加到您想要的顺序即可:

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer{

    @Autowired
    private LogInterceptor logInterceptor;

    @Autowired
    private AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor);
        registry.addInterceptor(authInterceptor);
    }

}

如果你有多个 WebMvcConfigurer ,你可以简单地使用 @Order 来控制 WebMvcConfigurer 的执行顺序(较低的值具有较高的优先级):

@EnableWebMvc
@Configuration
@Order(1)
public class FooWebConfig implements WebMvcConfigurer{

}

@EnableWebMvc
@Configuration
@Order(2)
public class BarWebConfig implements WebMvcConfigurer{

}