在 micronaut 中,通过 http 过滤器中断请求并返回 403 响应的核心在于:不调用 `chain.proceed(request)`,而是直接返回一个完成的响应 publisher(如 `mono.just(…)`)。这会跳过后续所有过滤器和控制器逻辑,立即向客户端发送状态码与响应体。
Micronaut 的 HttpServerFilter 是响应式设计,其 doFilter 方法返回 Publisher>,因此你既可以将请求委托给下游(chain.proceed(request)),也可以“短路”整个处理链,自行构造并返回响应。
以下是一个完整、生产就绪的示例:
import io.micronaut.core.annotation.NonNull;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.HttpStatus;
import io.micronaut.http.filter.HttpServerFilter;
import io.micronaut.http.filter.ServerFilterChain;
import io.micronaut.http.MutableHttpRequest;
import io.micronaut.http.MutableHttpResponse;
import reactor.core.publisher.Mono;
@Filter("/hello")
public class HelloWorldFilter implements HttpServerFilter {
@Override
@NonNull
public Mono<MutableHttpResponse> doFilter(
@NonNull MutableHttpRequest request,
@NonNull ServerFilterChain chain) {
if (HelloWorldValidator.valid(request)) {
// 校验通过:继续执行后续过滤器和目标控制器
return chain.proceed(request);
} else {
// 校验失败:立即终止处理,返回 403 Forbidden
return Mono.just(HttpResponse.status(HttpStatus.FORBIDDEN)
.body("Access denied: invalid request"));
}
}
}
✅ 关键要点说明: