8

クロスドメイン http リクエスト (allowedOrigins = *) を許可し、CrossOriginFilter を使用してクロスドメイン認証 (allowCredentials=true) を許可するように Jetty サーバーを構成します。認証要件のないクロスドメイン http リクエストは問題なく動作します。認証が必要な http 呼び出しに関しては、JQuery を使用してもうまくいきません。私は次のコードを使用し、この例に従いました: http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/

function login(username, password) {
$.ajax({
    type: "GET",
    contentType: "application/json",
    dataType: "json",
    url: url,
    beforeSend: function(xhr) {
        var base64 = Base64.encode(username + ":" + password);
        xhr.setRequestHeader("Authorization", "Basic " + base64);
        xhr.withCredentials = true;
    },
    error: function(data){
        alert("error");
    },
    success: function(data){
        alert("success"); 
    }
});

HTTPFox では、サーバーへの次の要求が表示されます。

OPTIONS /login HTTP/1.1
...
Access-Control-Request-Method   GET
Access-Control-Request-Headers  authorization,content-type

サーバーは

HTTP/1.1 204 No Content
...
Allow   OPTIONS,GET,HEAD

以下のオプションも使用しましたが、違いはありません。

$.ajax({
    ...
    username: username,
    password: password,
    ...
}

エラー関数は常に起動します。誰でも問題が何であるか考えていますか?

4

3 に答える 3

5

デフォルトで許可されているヘッダーは

X-Requested-With,Content-Type,Accept,Origin

ヘッダーを追加する必要がありました

承認、コンテンツ タイプ

ログファイルを介してこれを見つけました

DEBUG [2012-05-27 17:04:02,468] org.eclipse.jetty.servlets.CrossOriginFilter: ヘッダー [authorization,content-type] は、許可されたヘッダー [X-Requested-With、Content-Type、Accept、Origin] の中にありません]

すべてのヒントをありがとう!

于 2012-05-27T17:16:09.053 に答える
3

アプリケーションで設定した応答ヘッダー-セキュリティが有効になっていない場合、00 は問題なく動作します。ただし、セキュリティが有効になっている場合、クロスドメイン リクエストは失敗します。

これは、応答を生成するためにセキュリティ フィルタによって設定される追加のフィルタと追加の応答ヘッダーが原因である可能性があります。

この問題を解決するための高レベルの解決策は、セキュリティ フィルターが応答ヘッダーを設定したり、クライアントにコミットしたりする前に、応答ヘッダーを設定する必要があるということです。

Jetty も使用しています。したがって、Jetty Cross Origin Filterを使用して、設定が必要な順序で応答ヘッダーがフィルター チェーンに設定されるようにすることができます。

以下は、web.xml のフィルター構成に渡すことができるパラメーターのリストです。

  • allowedOrigins は、リソースへのアクセスが許可されているオリジンのカンマ区切りのリストです。デフォルト値は * で、すべてのオリジンを意味します

  • allowedMethods は、リソースへのアクセス時に使用できる HTTP メソッドのカンマ区切りのリストです。デフォルト値はGET、POSTです

  • allowedHeaders は、リソースへのアクセス時に指定できる HTTP ヘッダーのコンマ区切りリストです。デフォルト値は X-Requested-With です

  • preflightMaxAge、クライアントがプリフライト リクエストをキャッシュできる秒数。デフォルト値は 1800 秒または 30 分です。

  • allowCredentials は、リソースが認証情報を含むリクエストを許可するかどうかを示すブール値です。デフォルト値は false

デフォルトでは、Allowed Origins レスポンス ヘッダーは に設定されて*います。これは、デフォルトで、任意のドメインから任意のリクエストを作成できることを意味します。すべてのドメインからのすべてのリクエストを有効にしたくない場合は、ホワイトリストに登録する予定のドメインのみを許可するように、これを変更する必要があります。

フィルタの web.xml エントリ:

<web-app ...>
    ...
    <filter>
        <filter-name>cross-origin</filter-name>
        <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cross-origin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>

この特定の問題を解決するのに役立つ追加リソースのリストを次に示します。

于 2012-05-26T22:35:19.480 に答える
0

SOAPのものの場合、許可されるヘッダーにはmessagetype、soapactionも含める必要があります

許可されたヘッダーを構成するためのワイルドカードは許可されていないことに注意してください...

于 2012-07-11T16:22:49.657 に答える