网关gateway能写实现HandlerInterceptor的接口吗

网关gateway能写实现HandlerInterceptor的接口吗,好像会导致springbootweb jar和springcloudgateway jar冲突

直接实现 GlobalFilter

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    如果你想在Spring Cloud Gateway中实现HandlerInterceptor的接口来拦截请求,可以按照以下步骤修改代码避免与Spring Boot Web冲突:

    1. 引入spring-web依赖

    首先需要引入spring-web依赖,因为Spring Cloud Gateway的核心依赖没有包含它。

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
    
    1. 实现HandlerInterceptor的接口

    在你的拦截器实现类中实现HandlerInterceptor的接口,例如:

    @Component
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 在这里编写拦截请求的逻辑
            return true;
        }
    
        // 省略其他方法
    }
    
    1. 注册拦截器

    在Spring Cloud Gateway中,拦截器的注册方式与Spring Boot Web有一点不同。你需要在自己的配置类中手动创建拦截器,然后调用GatewayFilterFactory添加到过滤器链中。

    @Configuration
    public class MyConfig {
        @Autowired
        private MyInterceptor myInterceptor;
    
        @Bean
        public GatewayFilterFactory myFilter() {
            return new GatewayFilterFactory() {
                @Override
                public GatewayFilter apply(Object config) {
                    return (exchange, chain) -> {
                        ServerHttpRequest request = exchange.getRequest();
                        ServerHttpResponse response = exchange.getResponse();
                        Object handler = exchange.getExchange().getAttribute(HandlerMapping.BEST_MATCHING_HANDLER_ATTRIBUTE);
                        if (myInterceptor.preHandle(request.getServletRequest(), response.getServletResponse(), handler)) {
                            return chain.filter(exchange);
                        }
                        return Mono.empty();
                    };
                }
    
                // 省略其他方法
            };
        }
    }
    

    注意,这里的GatewayFilterFactory不能使用Spring Boot Web中的,需要引入Spring Cloud Gateway的依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    
    1. 添加拦截器到路由

    最后,在你的路由配置中添加拦截器:

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route(r -> r.path("/api/**")
                .filters(f -> f.stripPrefix(1)
                    .filter(myFilter().apply(null))) // 添加拦截器到过滤器链中
                .uri("http://localhost:8080"))
            .build();
    }
    

    现在你就可以在Spring Cloud Gateway中使用HandlerInterceptor接口的拦截器了,而不会与Spring Boot Web冲突。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^