[Jersey] CORS対応

Jersey2でREST APIを提供し、フロントエンドはNode.js (Koa) という構成のシステムを開発している。

APIはTomcat, フロントエンドはNode.jsなのでブラウザからは別ドメインと判定されてしまうので、クロスドメイン対応 (以降CORS対応) が必要。
今までは Apache を噛ませてヘッダーに Access-Control-Allow-ほにゃらら を無理やりくっつけていたんだけど、Apacheなしでも動作確認できるようにJerseyのFilterを作成した。

定型パターンだと思うので、コードを残しておく。

package jp.tmt_mc.smu_plus.api.filter;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;

/**
 * CORS対応フィルター
 *
 * @author kimurakazunori
 *
 */
public class CorsFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        // すべてのクライアントからの要求を許可する
        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Methods", "HEAD,GET,POST,PUT,DELETE");
        headers.add("Access-Control-Allow-Headers", "X-XXX-Authorization,Content-Type");
    }

}

今回は X-XXX-Authorization に認証トークンを格納する想定だけど、システムによってはいろんな独自ヘッダーを用いる事があると思う。その部分は変更が必要。

参考

コメント

このブログの人気の投稿

Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER is marked for publish/export but is not exported on the project classpath

蛍光灯フリッカー現象 (ちらつき) の対策

[node.js] CP932のテキストを読み込む