4

我知道关于这个错误已经有很多问题了。但是,即使设置了标题,我仍然无法让它工作

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

这是我来自 Jquery 的 AJAX 调用

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

我尝试从 chrome 的 dev-http 客户端调用我的 REST api,它工作正常(响应头设置了 Access-Control-Allow-Origin:*)。但是,当我从我的 html 文件中调用它时,我得到了错误。

我使用 JBoss 作为我的 rest api 和 tomcat 来托管我的客户端网页

4

1 回答 1

3

由于您发送的是内容类型的请求,application/json因此客户端被迫执行 CORS 飞行前请求。

CORS 规范规定application/x-www-form-urlencoded,除、multipart/form-data或之外的任何内容类型都text/plain需要飞行前请求来确定是否允许标头。

因此,您需要处理飞行前请求(HTTP 方法 = OPTIONS)。

为简单起见,让服务器响应标头:

Access-Control-Allow-Headers: *

这将允许所有请求标头。

更新

我再次阅读了您的问题,发现了一些我不明白的内容:您为什么要首先发送Content-TypeHTTP GET 请求的标头?这是不正确的。

只需删除

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

然后再试一次。那可能会解决它!

于 2013-03-19T21:20:09.827 回答