网关gateway能写实现HandlerInterceptor的接口吗,好像会导致springbootweb jar和springcloudgateway jar冲突
直接实现 GlobalFilter
不知道你这个问题是否已经解决, 如果还没有解决的话:如果你想在Spring Cloud Gateway中实现HandlerInterceptor的接口来拦截请求,可以按照以下步骤修改代码避免与Spring Boot Web冲突:
首先需要引入spring-web
依赖,因为Spring Cloud Gateway的核心依赖没有包含它。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
在你的拦截器实现类中实现HandlerInterceptor的接口,例如:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在这里编写拦截请求的逻辑
return true;
}
// 省略其他方法
}
在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>
最后,在你的路由配置中添加拦截器:
@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冲突。