2012-05-26 15 views
8

私はクロスドメインHTTPリクエスト(allowedOrigins = *)を許可し、CrossOriginFilterを使用してクロスドメイン認証(allowCredentials = true)を許可するように私のJettyサーバを設定します。 認証要求のないドメイン間のHTTP要求は正常に動作します。今、認証が必要なhttp呼び出しについては、JQueryを使用してもうまくいきません。私は、サーバーに次の要求を参照してくださいHTTPFoxでhttp://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/jqueryクロスドメイン認証

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"); 
    } 
}); 

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, 
    ... 
} 

エラー関数は常に発生します。 誰でも問題が何であるか考えてみませんか?

+0

を含める必要があり、あなたのレスポンスヘッダでこれを参照しています 'アクセス制御-Allow-Origin:* '?途中で大きな質問! StackOverflowへようこそ! – jmort253

+0

問題に関連するスタックトレースも表示できると便利だと思います。 – jmort253

+0

このヘッダがあなたの回答に含まれているかどうか確認してください。そうでない場合は、セキュリティが応答ヘッダーをオーバーライドする可能性があります。さらにデバッグするログをもっと見る必要があります。がんばろう! :) – jmort253

答えて

5

デフォルトではヘッダが

X-要求-では、Content-Typeの、受け入れ、起源です許されたよう

ログファイルを経由して、私は、ヘッダーにこれを見つけた

許可、コンテンツタイプ

を追加する必要がありました

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

ありがとうございました! SOAPのものについては

3

アプリケーションで設定したレスポンスヘッダー - セキュリティが有効になっていない場合は、00の証明はうまくいきます。ただし、セキュリティが有効になっていると、ドメイン間の要求は失敗します。

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

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

また、Jettyも使用しています。したがって、Jetty Cross Origin Filterを使用して、レスポンスヘッダーが設定する必要がある順番で、フィルタチェーンに設定されていることを確認できます。

ここでは、Webのフィルタ設定に渡すことができるパラメータのリストを示します.xmlファイル:

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

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

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

  • preflightMaxAge(クライアントがプリフライト要求をキャッシュできる秒数)。既定値は1800秒または30分

  • allowCredentialsリソースが資格情報で要求を許可するかどうかを示すブール値。デフォルト値は、デフォルトで

偽で、可起源レスポンスヘッダは、デフォルトでは、すべての要求は、任意のドメインから作ることができることを意味する、*に設定されています。あなたは、すべてのドメインからのすべての要求が有効になりたくないと仮定すると、あなたはホワイトリストに登録する予定のドメインのみを許可するように、これを変更することを確認する必要があります:

フィルターの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> 

ここでは、この特定の問題を解決するのに役立つかもしれない追加のリソースのリストです:

0

、許可のヘッダーもにmessageType、SOAPActionが

ワイルドカードが許可され、ヘッダーを設定することが許されないことに注意してください...

関連する問題