2013-03-19 1 views
4

Я знаю, что есть много вопросов относительно этой ошибки. Но, я все еще не могу получить эту работу даже после установки заголовкаПроисхождение URL не разрешено Access-Control-Allow-Origin

  "Access-Control-Allow-Origin" : "*" 

на моей стороне сервера.

Вот мой Spring MVC метод контроллера:

@RequestMapping(method=RequestMethod.GET, value="dummy/{num}") 
    @ResponseBody 
    public ResponseEntity<Result> dummy(@PathVariable String num) 
    { 
     int n = Integer.parseInt(num); 
     final Result result = new Result(); 
     result.setAddition(n+20); 
     result.setMultiplication(n*20); 
     result.setSubtraction(n-20); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Access-Control-Allow-Origin", "*"); 
     ResponseEntity<Result> ent = new ResponseEntity<Result>(result,headers,HttpStatus.CREATED); 
     return ent; 
    } 

А вот мой AJAX вызов из Jquery

$.ajax({ 
    url: "http://localhost:8010/Probe_Rest_Service/test/dummy/9", 
    type: "get", 
    crossDomain: true, 
    dataType: 'json', 
    headers: { 
    "Content-type" : "application/json" 
    }, 

    success: function(data){ 

     console.log("It worked!"); 
     alert(data); 
    }, 

    error: function(){ 
     // enable the inputs 
     alert("error"); 
    } 
}); 

Я попытался назвать мой REST API от Dev-клиента клиента для хрома и это работает fine (заголовок ответа имеет Access-Control-Allow-Origin: * set). Но, когда я вызываю его из своего html-файла, я получаю ошибку.

Я использую JBoss для моего отдыха апи и кота для размещения моего клиента веб-страницы

+0

Примечание: 'crossDomain: true,' не требуется. –

+0

Вы делаете html-файл с веб-сервера с помощью хром? –

+0

@KevinB Да, это правильно – CuriousCoder

ответ

3

Поскольку вы отправляете запрос с типом application/json контента клиент вынужден сделать запрос на предполетной CO.

CORS specification говорит, что любой тип контента, кроме application/x-www-form-urlencoded, multipart/form-data или text/plain требует запроса предварительного полета, чтобы определить, разрешено ли заголовок.

Следовательно, вам необходимо обработать запрос перед полетом (метод HTTP = OPTIONS).

Чтобы сделать это просто, пусть сервер ответит с заголовком:

Access-Control-Allow-Headers: * 

Это позволит все заголовки запроса.

UPDATE

Я снова прочитал ваш вопрос, и нашел что-то я не понимаю: почему вы посылаете заголовок Content-Type в первую очередь для запроса HTTP GET? Это неверно.

Просто удалите

headers: { 
    "Content-type" : "application/json" 
} 

и повторите попытку. Это может исправить!

+0

Большое спасибо. Это сработало :) – CuriousCoder

+0

Для запроса POST я по-прежнему получаю ошибку перекрестного происхождения, и я пытаюсь исправить ее, выполнив предполетный запрос, как вы предложили. Для этого, вы имеете в виду, что мне нужно просто отправить пустой ответ с заголовком HTTP, установленным в «Access-Control-Allow-Headers: *»? – CuriousCoder

Смежные вопросы