2016-02-04 54 views
1

工作我想我的消費(CORS兼容)RESTful服務訪問控制允許來源不是AngularJS應用

@Path("/greeting") 
@GET 
@Produces("application/json") 
public Response greeting() { 

    String result = "{\"id\":1,\"content\":\"Hello, World!\"}"; 

    return Response.ok() //200 
      .entity(result) 
      .header("Access-Control-Allow-Origin", "*") 
      .build(); 
} 
從我AngularJS應用

function ($scope, $http) { 
    $scope.dashboard = "ESCO Dashboard"; 


    console.log('start'); 

    // Simple GET request example: 
    $http({ 
     method: 'GET', 
     url: 'http://localhost:8080/NobelGrid/api/users/greeting' 
    }).then(function successCallback(response) { 
     console.log('success'); 
     $scope.greeting = response.data; 
    }, function errorCallback(response) { 
     console.log('error'); 
    }); 


    console.log('end'); 

} 

但我有此錯誤:

XMLHttpRequest cannot load http://localhost:8080/NobelGrid/api/users/greeting . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:63342 ' is therefore not allowed access.

使用Chrome的控制檯網絡,這似乎引起響應頭真的是:

enter image description here

反正訪問的REST服務從瀏覽器而不是從Angular應用程序,標頭是正確的

enter image description here

我也試過這個教程:

https://spring.io/guides/gs/consuming-rest-angularjs/

與他們的RESTful服務(也CORS兼容,他們說),但結果是一樣的。

ps:我正在使用WebStorm作爲IDE。

更新 - 解決

在服務器端寫這個處理程序:

@Path("/greeting") 
@OPTIONS 
@Produces("application/json") 
public Response greetingOPT() { 


    return Response.status(200) //200 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS") 
      .header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia,Authorization") 
      .build(); 
} 

它的工作原理。在開始的時候它給我一個錯誤:

Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight [..]

但加入Authorization到GET的Access-Control-Allow-Headers和POST解決問題。

回答

2

查看錯誤信息:

Response to preflight request

看看網絡日誌:

Request Method: OPTIONS

看看你的API:

@GET

你需要編寫the preflight OPTIONS request處理程序在瀏覽器將GET請求發送到您編寫的處理程序之前。

+0

嗨@Quentin!我不明白(對不起):我必須在服務器端編寫一個OPTIONS處理程序?或者我必須在客戶端做一些事情?非常感謝 –

+0

您必須在您的服務器上爲OPTIONS編寫一個處理程序(或更改請求,以便它不需要預檢檢查(具體細節在回答中鏈接的另一端進行了描述))。 – Quentin

+0

謝謝#Quentin!請你能看到我的更新? –

相關問題