过滤器示例
下面是几个常见的过滤器示例:
认证过滤器
认证过滤器用于对请求进行身份验证,如果请求没有携带合法的身份凭证,则返回401未授权错误。以下是一个示例:
代码语言:javascript复制@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !isValidToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
private boolean isValidToken(String token) {
// 验证token的逻辑
return true;
}
}
在上面的示例中,我们通过实现GlobalFilter接口来实现认证过滤器,如果请求头中没有携带合法的Authorization头,则返回401未授权错误。
限流过滤器
限流过滤器用于限制请求的访问速率,防止恶意请求导致服务不可用。以下是一个示例:
代码语言:javascript复制@Component
public class RateLimitFilter implements GatewayFilter, Ordered {
private final Map<String, Integer> counters = new ConcurrentHashMap<>();
private final int limit = 10;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String key = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
int count = counters.getOrDefault(key, 0);
if (count >= limit) {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
return exchange.getResponse().setComplete();
}
counters.put(key, count 1);
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
在上面的示例中,我们通过实现GatewayFilter接口来实现限流过滤器,使用ConcurrentHashMap来记录每个IP地址的请求次数,如果超过了限制次数,则返回429太多请求错误。
路径重写过滤器
路径重写过滤器用于将请求的路径重写为目标路径,例如将请求/hello重写为/hello-world。以下是一个示例:
代码语言:javascript复制@Component
public class RewriteFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequest newRequest = request.mutate()
.path("/hello-world")
.build();
ServerWebExchange newExchange = exchange.mutate()
.request(newRequest)
.build();
return chain.filter(newExchange);
}
@Override
public int getOrder() {
return 0;
}
}
在上面的示例中,我们通过实现GatewayFilter接口来实现路径重写过滤器,将请求的路径重写为/hello-world。