1

私のnetty 4 + GuiceアプリケーションにResteasyを統合することは、Resteasyが提供するサーバーアダプターを使用して完全に機能します(素晴らしい仕事です)。

現在、私の JAX-RS サーバーは、私の HTTP サーバー (これも Netty に基づいています) とは異なるポートで実行されます。

したがって、次の HTTP ヘッダーを応答に追加して、Resteasy サーバーに Cross Origin Resource Sharing (CORS) を実装する必要があります。

Access-Control-Allow-Origin : *
Access-Control-Allow-Methods : GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Headers : X-Requested-With, Content-Type, Content-Length

今のところ、私は NettyJaxrsServer と RestEasyHttpResponseEncoder クラスをフォークしましたが、それは非常にうまく機能します (しかし、私にとってはあまり「クリーンな」ソリューションではありません)。

Netty パイプラインに追加できるカスタマイズされたエンコーダーのようなもの (または他の何か...) を使用して、これらのヘッダーを応答に追加する方法を知りたいだけです。

ありがとう。

4

1 に答える 1

3

解決策: 次のように SimpleChannelInboundHandler を作成します。

public class CorsHeadersChannelHandler extends SimpleChannelInboundHandler<NettyHttpRequest> {
    protected void channelRead0(ChannelHandlerContext ctx, NettyHttpRequest request) throws Exception {
        request.getResponse().getOutputHeaders().add("Access-Control-Allow-Origin", "*");
        request.getResponse().getOutputHeaders().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        request.getResponse().getOutputHeaders().add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");

        ctx.fireChannelRead(request);
    }
}

これを Netty パイプラインの RestEasyHttpResponseEncoder の直前に追加します。

注: 最後に、既存の Netty Http サーバー パイプラインの最後に RestEasyHttpRequestDecoder、RestEasyHttpResponseEncoder、および RequestHandler を追加したので、CORS ヘッダーはもう必要ありません。

于 2013-09-21T17:05:51.400 に答える