首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在spring网关的application.properties配置中注册路由过滤器?

是否可以在spring网关的application.properties配置中注册路由过滤器?
EN

Stack Overflow用户
提问于 2021-09-19 12:18:08
回答 1查看 713关注 0票数 0

我在spring网关项目中定义了一个自定义过滤器,现在我发现必须在代码中注册自定义过滤器,如下所示:

代码语言:javascript
复制
@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中像这样配置了路由:

代码语言:javascript
复制
# 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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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中的路由工厂中定义如下:

代码语言:javascript
复制
spring.cloud.gateway.routes[0].filters[0]=MyFilterFactory

问题是,请求没有输入定义的JwtAuthenticationFilter

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-19 13:15:11

是的,有可能,需要注册一个扩展GatewayFilterFactory类的bean。

例如:

代码语言:javascript
复制
@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文件中使用它的名称。

代码语言:javascript
复制
spring.cloud.gateway.routes[0].filters[0]=MyFilterFactory

不需要在属性文件.中使用工厂名称。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69243196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档