在 OSGi 容器中为 Jersey-Grizzly 服务器内的 Rest 服务配置响应 object(使用 Jersey 1x 防止 CORS 错误)

Configure Response object for Rest Services inside a Jersey-Grizzly server, in OSGi container (CORS error prevention with Jersey 1x)

最近几天,我一直在为一个问题而苦恼。我在 OSGi 容器内创建了一个由 Grizzly 服务器托管的休息服务。此时一切都运行良好。

现在,我想在每个 response.Not 中添加一个 header 如此复杂或不合逻辑吧?然而,我找不到办法。

我尝试过:

1) 按照 this question 的建议在其余函数中获取响应 object(当您不在 OSGi 下时,这是一本漂亮的教科书)。

2) 使用上面的代码添加处理程序(在这种情况下永远不会调用服务方法)

    server.getServerConfiguration().addHttpHandler(
            new HttpHandler() {
                @Override
                public void service(Request arg0, Response arg1)
                        throws Exception {
                    arg1.setHeader("Access-Control-Allow-Origin", "*");
                }
            });

我使用的是jersey-server/client/core 1.18.1和grizzly2-server 1.18.1,因此我更喜欢可以在这个版本中应用的解决方案,但如果无法完成,我愿意更新jar版本在 1.18.x.

您可以尝试 Jersey 过滤器。
简而言之,您应该创建 class 实现 ContainerResponseFilter:

public class MyFilter implements ContainerResponseFilter {

    @Override
    public void filter(
        ContainerRequest request,
        ContainerResponse response
    ) throws IOException {
        request.getHttpHeaders().add(<header name>, <header value>);
    }
}

然后,您应该在 Jersey 服务器配置中注册此过滤器。
请注意,每次响应都会调用此过滤器。要仅将其绑定到特定资源,您可以使用注释绑定,描述为 here.
您可以找到的所有其他信息 here.