Code: Select all
@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();
}
}
< /code>
Wenn ich den benutzerdefinierten Filter nicht registriere, wirkt sich der Filter nicht wie erwartet aus und funktioniert nicht. Aber ich habe die Route in application bereits konfiguriert.# 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/**
< /code>
Ich denke, wir sollten die Routenkonfiguration sowohl in Code- als auch in der Konfigurationsdatei nicht definieren. Was soll ich tun, um den Filter nur zu registrieren? Gibt es einen besseren Weg, um mit der Situation umzugehen? Sollte ich die Route im Code definieren? Ich denke, die Konfiguration in der Datei wird flexibler.@Component
public class JwtAuthenticationFilter implements GatewayFilter {
@Value("${dolphin.gateway.jwt.verify:true}")
private boolean jwtVerfiy;
final static List apiEndpoints = List.of("/register", "/login");
final static Predicate isApiSecured = r -> apiEndpoints.stream()
.noneMatch(uri -> r.getURI().getPath().contains(uri));
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange);
}
}
Code: Select all
@Component
public class MyFilterFactory extends AbstractGatewayFilterFactory {
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
public MyFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return jwtAuthenticationFilter;
}
public static class Config {
}
}
Code: Select all
spring.cloud.gateway.routes[0].filters[0]=MyFilterFactory