12

問題が関連するテクノロジーにあるのか、それともテクノロジーに対する私の理解にあるのかはわかりません。

javascript で記述された html5 アプリケーションと、Apache 2.2 サーバーでホストされている html があります。

シンプルなRESTサービスをホストするjetty、guice、jackson、jerseyを使用してJavaで書かれたJavaアプリケーションがあります。

両方のアプリケーションは同じボックスで実行され、1 つはポート 80 (Apache でホストされている純粋な html5 アプリケーション)、もう 1 つは 8080 (jetty/guice でホストされている純粋な Java アプリケーション) で実行されます。

答えは、送り返すヘッダーにあると思います。CORS ヘッダーは、外部アプリケーションが API にヒットすることを許可することをブラウザーに伝えます。Jetty、Guice サーバーが正しい CORS ヘッダーを返すように構成する方法がわかりません。

組み込みの Jetty サーバーを使用しているため、ヘッダーを追加するための web.xml ファイルがありません。

また、HTML5 アプリケーション サーバー (この場合は apache 2.2) がアプリケーションを提供する方法にも関係している可能性があります。

Apache httpd.conf ファイルには次のエントリがあります。

LoadModule headers_module modules/mod_headers.so

<IFModule mod_headers>
    Header add Access-Control-Allow-Origin "*"
    Header add Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE, HEAD
    Header add Access-Control-Allow-Headers: X-PINGOTHER
    Header add Access-Control-Max-Age: 1728000  
</IfModule>

私のguiceサーブレット構成には、次のものがあります。

public class RestModule extends ServletModule{

    @Override
    protected void configureServlets() {
        bind(QuestbookService.class);

        // hook Jersey into Guice Servlet
        bind(GuiceContainer.class);

        // hook Jackson into Jersey as the POJO <-> JSON mapper
        bind(JacksonJsonProvider.class).in(Scopes.SINGLETON);

        Map<String, String> guiceContainerConfig = new HashMap<String, String>();
        guiceContainerConfig.put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES,
            HttpStatusCodeMetricResourceFilterFactory.class.getCanonicalName());
        serve("/*").with(GuiceContainer.class, guiceContainerConfig);
    }
}

応答ヘッダーを設定する場所がないため、問題は私のguice構成にあると思います。

組み込みの jetty サーバーを使用しているため、開発モードではチェック全体がバイパスされると考えましたが、間違っている可能性があります。

アドバイスありがとうございます。

4

3 に答える 3

18

私のアプリケーションの特定の要件に従ってください。サーバーは、クライアントから完全に分離する必要があります。クライアントは、可能な方法で通信サーバーに接続できる必要があります。

このアプリケーションの最初の実装は REST 駆動になるため、どこからでも休憩を受け入れることができる必要があります。

さらに、完全に xml を使用しない構成が必要なため、組み込みの Jetty サーバーで Guice を使用しています。web.xml ファイルがないため、ヘッダーを設定して CORS を許可する方法がわかりませんでした。

多くの試行錯誤を繰り返し、guice のドキュメントを読んだ後、サーバーから出る応答に CORS ヘッダーを追加する方法を見つけました。

Guice ServletModule クラスを使用すると、フィルターをサーブレット コンテキストに追加できます。これにより、すべてのリクエストが特定のサーブレットを通過できるようになります。

CORS リクエストに応答する残りのアプリケーションを構築しようとしているので、任意のリクエストの応答に cors ヘッダーを追加するフィルターが必要でした。

そこで、guice を使用して組み込みサーバーで cors を有効にするために、次のようなフィルターを作成しました。

@Singleton
public class CorsFilter implements Filter{

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain filterChain) throws IOException, ServletException {

        if(response instanceof HttpServletResponse){
        HttpServletResponse alteredResponse = ((HttpServletResponse)response);
        addCorsHeader(alteredResponse);
    }

    filterChain.doFilter(request, response);
    }

    private void addCorsHeader(HttpServletResponse response){
        //TODO: externalize the Allow-Origin
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");
        response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
        response.addHeader("Access-Control-Max-Age", "1728000");
    }

    @Override
    public void destroy() {}

    @Override
    public void init(FilterConfig filterConfig)throws ServletException{}
}

Guice は、Guice サーブレットを構成できる抽象クラスを提供します。

構成モジュールは次のようになります。

public class RestModule extends ServletModule{

    @Override
    protected void configureServlets() {
        bind(MyServiceClass.class);

        // hook Jersey into Guice Servlet
        bind(GuiceContainer.class);

        // hook Jackson into Jersey as the POJO <-> JSON mapper
        bind(JacksonJsonProvider.class).in(Scopes.SINGLETON);

        Map<String, String> guiceContainerConfig = new HashMap<String, String>();

        serve("/*").with(GuiceContainer.class, guiceContainerConfig);

        filter("/*").through(CorsFilter.class);
    }
}

これで、guice はすべての応答に cors ヘッダーを追加します。提供されている場所に関係なく、純粋な HTML 5 アプリケーションが対話できるようにします。

于 2013-05-05T01:16:21.903 に答える