
在 micronaut 中,通过 http 过滤器中断请求并返回 403 响应的核心在于:不调用 `chain.proceed(request)`,而是直接返回一个完成的响应 publisher(如 `mono.just(...)`)。这会跳过后续所有过滤器和控制器逻辑,立即向客户端发送状态码与响应体。
Micronaut 的 HttpServerFilter 是响应式设计,其 doFilter 方法返回 Publisher
以下是一个完整、生产就绪的示例:
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> 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"));
}
}
} ✅ 关键要点说明:
- 使用 Mono.just(...) 构造单次响应 Publisher,确保响应立即发出;
- 推荐显式设置响应体(如 .body("..."))以增强可观测性与调试友好性;
- 若需返回 JSON 错误结构,可搭配 JsonError 或自定义错误对象,例如:
HttpResponse.badRequest(new ApiError("Invalid token", "AUTH_001")) - 注意 @Filter 的路径匹配支持 Ant 风格(如 /api/**)或正则(@Filter(patterns = "/api/.*", type = FilterType.REGEX)),请按需配置;
- 所有异常应尽量在过滤器内捕获并转换为标准响应,避免抛出未处理异常导致 500。
? 小结:Micronaut 的过滤器机制天然支持“短路响应”,只需绕过 chain.proceed() 并返回一个完成的 HttpResponse Publisher,即可高效实现权限校验、参数预检等横切逻辑——简洁、响应式、无侵入。










