
在 micronaut 中,可通过在 `httpserverfilter` 的 `dofilter` 方法中直接返回一个 `publisher
Micronaut 的过滤器机制基于响应式编程模型(Reactor),其 doFilter 方法返回一个 Publisher
以下是一个完整、可运行的示例:
import io.micronaut.core.annotation.NonNull;
import io.micronaut.http.HttpRequest;
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.MutableHttpResponse;
import reactor.core.publisher.Mono;
import java.util.concurrent.Flow;
@Filter("/hello")
public class HelloWorldFilter implements HttpServerFilter {
@Override
@NonNull
public Flow.Publisher> doFilter(
@NonNull HttpRequest> 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"));
}
}
} ✅ 关键要点说明:
- 使用 Mono.just(...) 构造单响应发布者(适用于同步、无副作用的短路响应);
- HttpResponse.status(...).body(...) 可添加响应体,提升调试与客户端友好性;
- 确保 HelloWorldValidator.valid(...) 是线程安全且无阻塞操作(Micronaut 过滤器运行在非阻塞 I/O 线程上);
- 若需异步校验(如 JWT 解析、远程鉴权),应返回 Mono.fromCompletionStage(...) 或 Mono.defer(...),避免阻塞线程;
- 多个过滤器按注册顺序执行,短路响应将跳过所有后续过滤器及目标控制器方法。
? 小贴士:
为提升可维护性,建议将错误响应封装为工具方法(如 forbidden(String reason)),并在全局异常处理器(@ControllerAdvice)中统一处理业务异常,而过滤器专注「请求准入控制」这一横切关注点。










