You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ninja Framework中通过过滤器修改所有Result响应?

在Ninja Framework中全局添加CORS Headers的解决方案

你说的没错,普通的Filter确实是在控制器方法执行前运行的,没法直接修改返回的Result。不过Ninja Framework提供了ResultInterceptor这个扩展点,正好能解决你的问题——它会在控制器方法执行完成、Result准备发送给客户端之前被调用,完美适合全局修改Result的headers,而且不用在每个控制器写重复代码。

下面是具体的实现步骤:

1. 创建自定义ResultInterceptor

这个拦截器会检查请求路径是否符合你的指定规则,然后给对应的Result添加CORS headers:

import ninja.Context;
import ninja.Result;
import ninja.ResultInterceptor;
import ninja.Results;

public class CorsResultInterceptor implements ResultInterceptor {

    @Override
    public Result intercept(Context context, Result result) {
        // 这里定义你的路径匹配规则,比如匹配所有/api开头的请求
        String requestPath = context.getRequestPath();
        if (requestPath.startsWith("/api/")) {
            // 添加基础的CORS headers,可根据需求调整
            result.addHeader("Access-Control-Allow-Origin", "https://your-frontend-domain.com")
                  .addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
                  .addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization")
                  .addHeader("Access-Control-Max-Age", "3600");
            
            // 处理浏览器的OPTIONS预检请求,直接返回200
            if ("OPTIONS".equalsIgnoreCase(context.getMethod())) {
                return Results.ok().copyResult(result);
            }
        }
        return result;
    }
}

2. 注册全局拦截器

把刚才的拦截器注册到你的Ninja模块中,这样它就会对所有请求生效:

import ninja.Module;
import ninja.NinjaModule;

@NinjaModule
public class AppModule extends Module {

    @Override
    protected void configure() {
        // 将自定义拦截器绑定为全局Result拦截器
        bind(ResultInterceptor.class).to(CorsResultInterceptor.class);
    }
}

关键说明

  • ResultInterceptor的作用时机:它是在控制器方法执行完成后、Result序列化前触发,所以可以安全地修改Result的headers、状态码等属性。
  • 路径匹配灵活性:如果你的路径规则更复杂(比如需要正则匹配),可以用Ninja的PathMatcher工具类来实现更精准的匹配。
  • CORS参数调整:不要随便用*作为Access-Control-Allow-Origin,建议指定实际的前端域名,提升安全性;Access-Control-Allow-Headers要包含前端实际发送的请求头。

这样一来,所有符合路径规则的请求都会自动带上CORS headers,不用在每个控制器里重复编写添加headers的代码,也不用担心遗漏。

内容的提问来源于stack exchange,提问作者Zalán Meggyesi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:09:35