我在spring网关项目中定义了一个自定义过滤器,现在我发现必须在代码中注册自定义过滤器,如下所示:
@Configuration
public class GatewayConfig {
private final JwtAuthenticationFilter filter;
public GatewayConfig(JwtAuthenticationFilter filter) {
this.filter = filter;
}
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("auth", r -> r.path("/auth/**").filters(f -> f.filter(filter)).uri("lb://auth"))
.route("music", r -> r.path("/music/**").filters(f -> f.filter(filter)).uri("lb://dolphin-music")).build();
}
}如果不注册自定义筛选器,则筛选器将不会生效并按预期工作。但是,我已经在application.properties中像这样配置了路由:
# dolphin music
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.discovery.locator.lower-case-service-id=true
spring.cloud.gateway.routes[0].id=dolphin-music-service
# forward by ip:port way
spring.cloud.gateway.routes[0].uri=http://10.107.64.246:11014
# forward by service name way
# spring.cloud.gateway.routes[0].uri=lb://
spring.cloud.gateway.routes[0].predicates[0]=Path=/music/**我认为我们不应该在代码和配置文件中定义路由配置,我应该做什么来只注册过滤器?有什么更好的方法来处理这种情况吗?我应该在代码中定义路由吗?我认为文件中的配置会更多的flexible.BTW,这是JwtAuthenticationFilter
@Component
public class JwtAuthenticationFilter implements GatewayFilter {
@Value("${dolphin.gateway.jwt.verify:true}")
private boolean jwtVerfiy;
final static List<String> apiEndpoints = List.of("/register", "/login");
final static Predicate<ServerHttpRequest> isApiSecured = r -> apiEndpoints.stream()
.noneMatch(uri -> r.getURI().getPath().contains(uri));
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange);
}
}我试图像这样添加MyFilterFactory:
@Component
public class MyFilterFactory extends AbstractGatewayFilterFactory<MyFilterFactory.Config> {
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
public MyFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return jwtAuthenticationFilter;
}
public static class Config {
}
}并在application.properties中的路由工厂中定义如下:
spring.cloud.gateway.routes[0].filters[0]=MyFilterFactory问题是,请求没有输入定义的JwtAuthenticationFilter。
发布于 2021-09-19 13:15:11
是的,有可能,需要注册一个扩展GatewayFilterFactory类的bean。
例如:
@Component
public class MyFilterFactory extends
AbstractGatewayFilterFactory<MyFilterFactory.Config> {
public MyFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return new MyFilter(); // or MyFilter(config), depending on your needs
}
public static class Config {
// this can be empty if you don't need to pass any filter arguments
}
}然后您可以在application.properties文件中使用它的名称。
spring.cloud.gateway.routes[0].filters[0]=MyFilterFactory不需要在属性文件.中使用工厂名称。
https://stackoverflow.com/questions/69243196
复制相似问题