Spring 云网关自定义网关过滤器不工作
Spring Cloud Gateway Custom Gateway Filter Not Working
我正在尝试调试我的应用程序,但调试器没有命中此代码块。这是我的自定义网关过滤器。
@RefreshScope
@Component
public class AuthorizationHeaderFilter extends
AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config> {
@Autowired
Environment environment;
public AuthorizationHeaderFilter () {
super(Config.class);
}
public static class Config {
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
if(!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
return onError(exchange, "No authorization header", HttpStatus.UNAUTHORIZED);
}
String token = Objects.requireNonNull(request.getHeaders().get(HttpHeaders.AUTHORIZATION))
.get(0).replace("Bearer","");
if(isJwtValid(token))
return onError(exchange, "JWT Token is not valid", HttpStatus.UNAUTHORIZED);
return chain.filter(exchange);
});
}
private Mono<Void> onError(ServerWebExchange exchange, String error, HttpStatus status) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(status);
return response.setComplete();
}
private boolean isJwtValid(String token) {
boolean returnValue = true;
String subject = Jwts.parser().setSigningKey(environment.getProperty("token.secret")).parseClaimsJws(token)
.getBody().getSubject();
if(subject == null || subject.isEmpty())
returnValue = false;
return returnValue;
}
}
这是此过滤器的配置
spring.cloud.gateway.routes[0].id=users-status-check
spring.cloud.gateway.routes[0].uri=lb://users-ws
spring.cloud.gateway.routes[0].predicates[0]=Path=/users-ws/users/status
spring.cloud.gateway.routes[0].predicates[1]=Method=GET
spring.cloud.gateway.routes[0].predicates[2]=Header=Authorization, Bearer (.*)
spring.cloud.gateway.routes[0].filters[0]=RewritePath=/users-ws/(?<segment>.*), /${segment}
spring.cloud.gateway.routes[0].filters[1]=AuthorizationHeaderFilter
当尝试向此端点发送请求时,它不会启动调试器或将日志打印到控制台。我在这里缺少什么。谢谢。
如果我像这样在主应用程序中创建 AuthorizationHeaderFilter bean
@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@Bean
public AuthorizationHeaderFilter authorizationHeaderFilter() {
return new AuthorizationHeaderFilter();
}
}
应用程序在启动时抛出此错误
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'authorizationHeaderFilter' defined in com.springcloud.photoapp.api.ApiGateway.ApiGatewayApplication: @Bean definition illegally overridden by existing bean definition: Root bean: class [org.springframework.aop.scope.ScopedProxyFactoryBean];
我还将云 api 网关的日志记录级别设置为调试,这是日志
Mapping [Exchange: GET http://localhost:8764/users-ws/users/status] to
Route{id='ReactiveCompositeDiscoveryClient_USERS-WS', uri=lb://USERS-WS,
order=0, predicate=Paths: [/users-ws/**], match trailing slash: true,
gatewayFilters=[[[RewritePath /users-ws/(?<remaining>.*) = '/${remaining}'],
order = 1]], metadata={}}
RouteDefinition users-status-check applying {_genkey_0=/users-
ws/users/status} to Path
RouteDefinition users-status-check applying {_genkey_0=GET} to Method
RouteDefinition users-status-check applying {_genkey_0=Authorization,
_genkey_1=Bearer (.*)} to Header
RouteDefinition users-status-check applying filter {_genkey_0=/users-ws/(?
<segment>.*), _genkey_1=/${segment}} to RewritePath
RouteDefinition users-status-check applying filter {} to
AuthorizationHeaderFilter
嘿,我设法通过创建 RouteLocator @Bean 来解决这个问题,如下所示。现在,当我在调试器模式下发出请求时,我可以点击 AuthorizationHeaderFilter
中的 apply 方法
@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder rlb, AuthorizationHeaderFilter
authorizationHeaderFilter) {
return rlb
.routes()
.route(p -> p
.path("/users-ws/users/status")
.filters(f -> f.removeRequestHeader("Cookie")
.rewritePath("/users-ws/(?<segment>.*)", "/$\{segment}")
.filter(authorizationHeaderFilter.apply(new
AuthorizationHeaderFilter.Config())))
.uri("lb://users-ws")
)
.build();
}
}
我正在尝试调试我的应用程序,但调试器没有命中此代码块。这是我的自定义网关过滤器。
@RefreshScope
@Component
public class AuthorizationHeaderFilter extends
AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config> {
@Autowired
Environment environment;
public AuthorizationHeaderFilter () {
super(Config.class);
}
public static class Config {
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
if(!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
return onError(exchange, "No authorization header", HttpStatus.UNAUTHORIZED);
}
String token = Objects.requireNonNull(request.getHeaders().get(HttpHeaders.AUTHORIZATION))
.get(0).replace("Bearer","");
if(isJwtValid(token))
return onError(exchange, "JWT Token is not valid", HttpStatus.UNAUTHORIZED);
return chain.filter(exchange);
});
}
private Mono<Void> onError(ServerWebExchange exchange, String error, HttpStatus status) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(status);
return response.setComplete();
}
private boolean isJwtValid(String token) {
boolean returnValue = true;
String subject = Jwts.parser().setSigningKey(environment.getProperty("token.secret")).parseClaimsJws(token)
.getBody().getSubject();
if(subject == null || subject.isEmpty())
returnValue = false;
return returnValue;
}
}
这是此过滤器的配置
spring.cloud.gateway.routes[0].id=users-status-check
spring.cloud.gateway.routes[0].uri=lb://users-ws
spring.cloud.gateway.routes[0].predicates[0]=Path=/users-ws/users/status
spring.cloud.gateway.routes[0].predicates[1]=Method=GET
spring.cloud.gateway.routes[0].predicates[2]=Header=Authorization, Bearer (.*)
spring.cloud.gateway.routes[0].filters[0]=RewritePath=/users-ws/(?<segment>.*), /${segment}
spring.cloud.gateway.routes[0].filters[1]=AuthorizationHeaderFilter
当尝试向此端点发送请求时,它不会启动调试器或将日志打印到控制台。我在这里缺少什么。谢谢。
如果我像这样在主应用程序中创建 AuthorizationHeaderFilter bean
@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@Bean
public AuthorizationHeaderFilter authorizationHeaderFilter() {
return new AuthorizationHeaderFilter();
}
}
应用程序在启动时抛出此错误
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'authorizationHeaderFilter' defined in com.springcloud.photoapp.api.ApiGateway.ApiGatewayApplication: @Bean definition illegally overridden by existing bean definition: Root bean: class [org.springframework.aop.scope.ScopedProxyFactoryBean];
我还将云 api 网关的日志记录级别设置为调试,这是日志
Mapping [Exchange: GET http://localhost:8764/users-ws/users/status] to
Route{id='ReactiveCompositeDiscoveryClient_USERS-WS', uri=lb://USERS-WS,
order=0, predicate=Paths: [/users-ws/**], match trailing slash: true,
gatewayFilters=[[[RewritePath /users-ws/(?<remaining>.*) = '/${remaining}'],
order = 1]], metadata={}}
RouteDefinition users-status-check applying {_genkey_0=/users-
ws/users/status} to Path
RouteDefinition users-status-check applying {_genkey_0=GET} to Method
RouteDefinition users-status-check applying {_genkey_0=Authorization,
_genkey_1=Bearer (.*)} to Header
RouteDefinition users-status-check applying filter {_genkey_0=/users-ws/(?
<segment>.*), _genkey_1=/${segment}} to RewritePath
RouteDefinition users-status-check applying filter {} to
AuthorizationHeaderFilter
嘿,我设法通过创建 RouteLocator @Bean 来解决这个问题,如下所示。现在,当我在调试器模式下发出请求时,我可以点击 AuthorizationHeaderFilter
中的 apply 方法@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder rlb, AuthorizationHeaderFilter
authorizationHeaderFilter) {
return rlb
.routes()
.route(p -> p
.path("/users-ws/users/status")
.filters(f -> f.removeRequestHeader("Cookie")
.rewritePath("/users-ws/(?<segment>.*)", "/$\{segment}")
.filter(authorizationHeaderFilter.apply(new
AuthorizationHeaderFilter.Config())))
.uri("lb://users-ws")
)
.build();
}
}