我在spring gateway專案中定義了一個自定義過濾器,現在我發現我必須在代碼中注冊這個自定義過濾器,像這樣:
public class GatewayConfig {
private final JwtAuthenticationFilter filter。
public GatewayConfig(JwtAuthenticationFilter filter) {
this.filter = filter。
}
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.rouse()
.route("auth", r -> r.path("/auth/**").f -> f.filter(filter)).uri("lb:/auth")
.route("music", r -> r.path("/music/**").f 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
#按IP:埠方式轉發
spring.cloud.gateway.routes[0].uri=http:/10.107.64.246:11014。
# 按服務名稱方式轉發
# spring.cloud.gateway.routes[0].uri=lb://
spring.cloud.gateway.routes[0].predicates[0]=Path=/music/**。
我認為我們不應該在代碼和組態檔中都定義路由配置,我應該怎么做才能只注冊過濾器呢? 有什么更好的方法來處理這種情況嗎? 我是否必須在代碼中定義路由?我認為檔案中的配置會更靈活。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"/span>, "/login"/span>) 。
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. 配置> {
@Autowired; MyFilterFactory.
private JwtAuthenticationFilter jwtAuthenticationFilter。
public MyFilterFactory() {
super(Config.class)。
}
@Override
public GatewayFilter apply(Config) {
return jwtAuthenticationFilter。
}
public static class Config {
}
}
并在application.properties中定義路由工廠,像這樣:
spring.cloud.gateway.routes[0]. filters[0]=MyFilterFactory
問題是,該請求沒有進入我定義的JwtAuthenticationFilter。
uj5u.com熱心網友回復:
是的,這是可能的,你需要注冊一個擴展了GatewayFilterFactory類的bean。
例如:
@Component
public class MyFilterFactory extendsAbstractGatewayFilterFactory<MyFilterFactory.Config> {
public MyFilterFactory() {
super(Config.class)。
}
@Override
public GatewayFilter apply(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://www.uj5u.com/qukuanlian/324184.html
標籤:
