6

ジャージークライアントは私のために「origin」ヘッダーを設定していません。何かが足りないのではないかと思います。

String origin="http://www.localhost.com";
ClientResponse response= webResourceBuilder("my/endpoint")
            .header( "origin" , origin)
            .header("Access-Control-Request-Method", "POST")
            .header("xorigin", origin)
            .header("whatever", "test")
            .accept("application/xml")
            .get(ClientResponse.class);

サーバー側でリクエストヘッダーを実行時に検査すると、「xorigin」と「whatever」ヘッダーが見つかりますが、「origin」と「Access-Control-Request-Method」は見つかりません。

これらのヘッダーを設定するにはどうすればよいですか?

4

2 に答える 2

15

デフォルトの Jersey クライアントは、HttpURLConnectionを使用してリクエストをサーバーに送信します。HttpUrlConnectionリクエストで送信される一部のヘッダーを制限します。次を参照してください。

/*
 * Restrict setting of request headers through the public api
 * consistent with JavaScript XMLHttpRequest2 with a few
 * exceptions. Disallowed headers are silently ignored for
 * backwards compatibility reasons rather than throwing a
 * SecurityException. For example, some applets set the
 * Host header since old JREs did not implement HTTP 1.1.
 * Additionally, any header starting with Sec- is
 * disallowed.
 *
 * The following headers are allowed for historical reasons:
 *
 * Accept-Charset, Accept-Encoding, Cookie, Cookie2, Date,
 * Referer, TE, User-Agent, headers beginning with Proxy-.
 *
 * The following headers are allowed in a limited form:
 *
 * Connection: close
 *
 * See http://www.w3.org/TR/XMLHttpRequest2.
 */
private static final boolean allowRestrictedHeaders;
private static final Set<String> restrictedHeaderSet;
private static final String[] restrictedHeaders = {
    /* Restricted by XMLHttpRequest2 */
    //"Accept-Charset",
    //"Accept-Encoding",
    "Access-Control-Request-Headers",
    "Access-Control-Request-Method",
    "Connection", /* close is allowed */
    "Content-Length",
    //"Cookie",
    //"Cookie2",
    "Content-Transfer-Encoding",
    //"Date",
    //"Expect",
    "Host",
    "Keep-Alive",
    "Origin",
    // "Referer",
    // "TE",
    "Trailer",
    "Transfer-Encoding",
    "Upgrade",
    //"User-Agent",
    "Via"
};

この状況を処理するには、次の 2 つのオプションがあります。

  1. デフォルトの Jersey クライアントでは、システム プロパティを設定する必要があります

    -Dsun.net.http.allowRestrictedHeaders=true
    

    これにより、リクエストからの制限付きヘッダーの削除が抑制されます。

  2. この制限がないように思われるApacheHttpClient / ApacheHttpClient4を使用してください。次の依存関係のいずれかをプロジェクトに追加するだけです。

    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-apache-client</artifactId>
        <version>1.15</version>
    </dependency>
    

    また

    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-apache-client4</artifactId>
        <version>1.15</version>
    </dependency>
    

    次に、次のようにクライアントを作成します。

    ApacheHttpClient.create(com.sun.jersey.api.client.config.ClientConfig);
    

    また

    ApacheHttpClient4.create(com.sun.jersey.api.client.config.ClientConfig);
    
于 2012-11-07T09:21:01.713 に答える
8

または、ヘッダーを設定する前にこのプロパティを動的に設定するだけです (グローバル設定として設定したくない場合)。

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
于 2013-09-26T12:30:43.520 に答える