2012-10-01 29 views
8

Estoy tratando de usar un servicio Angular.js para obtener un JSON de mi servicio REST realizado con Jersey/Spring.angular.js Chrome Access-Control-Allow-Origin

cuando estoy usando Firefox, funciona bien, pero cuando voy a Chrome i recibió el mensaje:

XMLHttpRequest cannot load http://localhost:8080/VirtualLawyerPj/services/timeoftheday/asjson/tue. Origin http://localhost:8090 is not allowed by Access-Control-Allow-Origin. 

Aquí está mi código de servicio:

angular.module('myAppServices', ['ngResource']). 
factory('Time', function($resource){ 
    return $resource('http://localhost:port/VirtualLawyerPj/services/timeoftheday/asjson/tue',{port:":8080"}, { 
     query: {method:'GET', params:{}, isArray:false} 
    }); 
}); 

Alguien tenía el mismo problema ? ¿Cómo conseguiste que esto funcionara?

Gracias.

+6

iniciar Chrome desde la línea de comandos y añadir el '- disable-web-security' bandera. '/ ruta/a/chrome/chrome --disable-web-security'. Es genial para probar –

+0

Funcionó para las pruebas! ¿Pero qué hay de la producción? Estoy empezando un nuevo proyecto y me siento un poco marcado por este "problema" en Angular.js –

+0

No es un problema con angular.js, sino con un navegador normal y el problema XMLHttpRequest. Debería funcionar en producción, ya que no estarás en el localhost. Pero realmente no sé mucho sobre CORS, tendrás que esperar a alguien más. –

Respuesta

2

La solución CORS se describe en html5rocks tutorial. Trabajó para mi.

+1

Aquí en combinación con AngularJS. http://nils-blum-oeste.net/cors-api-with-oauth2-authentication-using-rails-and-angularjs/ –

2

Todavía estoy aprendiendo Angular yo mismo, pero usar el servicio $ location para obtener el host de la url actual y el puerto facilita las cosas al mover el código entre entornos. Por cierto, esto también me ha ayudado a superar el problema que describes.

angular.module('myAppServices', ['ngResource']). 
factory('Time', ['$location', function($location) { 
    var url = 'http://:host::port/VirtualLawyerPj/services/timeoftheday/asjson/tue'; 
    var params = { 
    host: $location.host(), 
    port: $location.port() 
    }; 
    var actions = { 
    query: {method:'GET', isArray:false} 
    }; 
    return $resource(url, params, actions); 
}]) 
2

tengo un servidor Apache que se ejecuta en el puerto 80 y un servicio web REST en el puerto 8889, mismo servidor. Probé esta solución, pero no funcionó:

 
    myApp.config(['$httpProvider', function($httpProvider) { 
     $httpProvider.defaults.useXDomain = true; 
     delete $httpProvider.defaults.headers.common['X-Requested-With']; 
    }]);

La única manera de que me di cuenta de conseguir que esto era obra:

  1. El archivo services.js:

     
    angular.module('mirthServices', ['ngResource']). 
        factory('Cs', function ($resource) { 
         return $resource('http://localhost/rest/cs/id/:csId'); 
        }); 
    
  2. En el archivo apache proxy.conf:

     
    ProxyPass /rest http://localhost:8889/REST 
    ProxyPassReverse /rest http://localhost:8889/REST 
    
+0

Resolví mi problema modificando la respuesta del servidor, pero necesita controlar también el servicio web, de curso. Agregué el encabezado Access-Control-Allow-Origin: *. –

0

He resuelto este problema mediante el cambio en Apache en httpd.conf:

.... 
<Directory> 
    ..... 
    Header set Access-Control-Allow-Origin "*" 
</Directory> 

he añadido la línea de cabecera de set y espero que esto ayuda a alguien

Cuestiones relacionadas