2013-05-21 12 views
44

私が制御するリモートサーバーからjsonを取得する際に問題があります。私は1つが、次の作品のjQueryを使用して、ポート5000

上で実行されているデータを提供し、ポート3311、その他、要求するデータ、上で実行されている2つのWebアプリケーションを、持っている:

$.ajax({ 
    url: "http://localhost:3311/get-data", 
    type: 'GET', 
    dataType: 'json', 
    beforeSend: function(xhr) { 
    xhr.setRequestHeader("x-some-header", "some-value"); 
    } 
}) 
.done(function(data) { 
    $rootScope.$apply(function() {d.resolve(data); }); 
}) 
.fail(function(data) { 
    $rootScope.$apply(function() {d.reject(data); }); 
}); 

同じ取得要求を試みます角度

$http 
    .get("http://localhost:3311/get-data", { headers: {"x-some-header": "some-value"} }) 
    .success(function(data) { d.resolve(data);}) 
    .error(function(data) { d.reject(data); }); 

と私はエラー

Origin http://localhost:5000 is not allowed by Access-Control-Allow-Origin. 

コンソールLを受け取りますOGは、OPTIONS要求がHTTP200

OPTIONS http://localhost:3311//get-data 200 (OK) angular.min.js:99 

(anonymous function) angular.min.js:99 

l angular.min.js:95 

m angular.min.js:94 

(anonymous function) app.js:78 

b.extend.each jquery-1.9.1.min.js:3 

b.fn.b.each jquery-1.9.1.min.js:3 

(anonymous function) app.js:76 

d angular.min.js:28 

instantiate angular.min.js:28 

(anonymous function) angular.min.js:52 

updateView angular-ui-states.js:892 

e.$broadcast angular.min.js:90 

transition angular-ui-states.js:324 

h angular.min.js:77 

(anonymous function) angular.min.js:78 

e.$eval angular.min.js:88 

e.$digest angular.min.js:86 

e.$apply angular.min.js:88 

e angular.min.js:94 

o angular.min.js:98 

s.onreadystatechange angular.min.js:99 

を返し、OPTIONS要求から返されるヘッダが

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: text/plain 
Server: Microsoft-IIS/8.0 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, OPTIONS 
Access-Control-Allow-Headers: Content-Type, Accept, X-Requested-With, x-some-header 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?.... 
X-Powered-By: ASP.NET 
Date: Tue, 21 May 2013 01:52:37 GMT 
Content-Length: 0 
+0

'$ http.defaults.useXDomain = true'をContainerResponseFilterを実装しますか? – jkoreska

+0

$ .ajaxを呼び出す前にjqueryに設定を提供していません。 '$ http.defaults.useXDomain = true'を追加しても何も変更されませんでした。 – Jason

答えて

52

である。これは、リクエストヘッダを含めることにより、角度のデフォルトの動作におそらく後にエラーが発生示します'X-Requested-With'、これはCORSに問題を引き起こす可能性があります。これは、クロスドメイン要求からヘッダーを削除することによって、v 1.1.1(不安定なブランチ - see v1.1.1 bug fixes)で修正されました:https://github.com/angular/angular.js/issues/1004

ヘッダーを削除して、1.0ブランチでこれを簡単に実行できます。次の行は、あなたのアプリで$ HTTPサービスによって行われたすべての要求(だけではなく、CORS)からヘッダを削除します:

yourModule 
    .config(function($httpProvider){ 
    delete $httpProvider.defaults.headers.common['X-Requested-With']; 
}); 

更新 少し警告 - 角度(jQueryのような)CORSをサポートしていません。 IE9のために。 IE10は、CORSをサポートする最初のIEブラウザです。このブログ投稿では、一定の条件の下でIE8/IE9でCORSのサポートを得ることができる方法を説明しますが、それは角度$ HTTPサービスでは動作しません。答えは上記の解決http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

+0

これは少し古いです、好ましい方法は、開発のためにプロキシを使用することです - http://forum.ionicframework.com/t/http-no-access-control-allow-origin-problem-on-投稿/ 5625 – Ghoti

2

web.configファイル

<system.webServer> 
<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
    </httpProtocol> 
    </system.webServer> 
0

問題。 HTMLページのようなサービスとの角度コントローラーを呼んでいた

<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
</httpProtocol> 

$http.get(dataUrl).success(function (data) { 
    $scope.data.products = data; 
}) 
.error(function (error) { 
    $scope.data.error = error; 
}); 
0

要求ヘッダは、サーバー側で設定する必要があります。 あなたはジャージーサーブレット COMに初期化PARAMTERとして渡すことができますカスタムクラスを開発することができ、サーバの

<filter> 
    <filter-name>ResponseFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ResponseFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

2.Independentすることができ、この

1.Oneを設定するには多くの方法があります。コンサルタント。TestCorpsFilter enter code here `パブリッククラスTestCorpsFilterはjQueryのために角度と` $ .support.cors = true`のために{

@Override 
    public ContainerResponse filter(ContainerRequest arg0, ContainerResponse arg1) { 
     ResponseBuilder resp = Response.fromResponse(arg1.getResponse()); 
     resp.header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", 
       "GET, POST, OPTIONS"); 

     String requestHeader = arg0.getHeaderValue("Access-Control-Request-Headers"); 

     if (requestHeader != null && !requestHeader.equals("")) { 
      resp.header("Access-Control-Allow-Headers", requestHeader); 
     } 

     arg1.setResponse(resp.build()); 
     return arg1; 

    } 
関連する問題