在Chrome中调用ajax restful ws时访问CORS

时间:2017-11-02 16:39:50

标签: javascript java ajax spring cors

我有基于网络的项目完全用jquery和js编写。在客户端,我通过像这样的ajax调用restful webservices

 $.ajax({
    type: 'GET',
    timeout: 1000000000,
    headers: { 'Access-Control-Allow-Origin': '*' },
    url: serverName + '/getAlerts/',
    data: {}, 
    dataType: "text", 
    success: function (data) {
        $scope.alerts = JSON.parse(data);
        $scope.$apply();
    },
    error: function (data) {
        alert(errServiceCall); 
    }
});

在服务器端,在Spring中创建了restful webservices。示例函数就是那样

@RequestMapping(value = "/services/getAlerts", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
@ResponseBody
public String getAlerts(HttpServletRequest request) throws JSONException, IOException, SQLException {
    return "hello it's me";
}

在这种情况下,当我在 Chrome 上尝试使用该功能时,我收到以下错误

  

(索引):374拒绝连接   ' http://servername/services/getAlerts/'因为它违反了   遵循内容安全政策指令:" connect-src' self'"。

如果我将完整的网址(http://servername/services/getAlerts)粘贴到Chrome地址栏中,则会成功返回结果。

我建议关于CORS(跨源资源共享),所以我添加了代码

headers: { 'Access-Control-Allow-Origin': '*' },

在我的ajax代码块中。但它没有奏效。

所以我试着在服务器端的函数上面添加@CrossOrigin参数,就像那样

@CrossOrigin
@RequestMapping(value = "/services/getAlerts", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
@ResponseBody
public String getAlerts(HttpServletRequest request) throws JSONException, IOException, SQLException {
    return "hello it's me";
}

但在这种情况下,我在编译时收到以下错误(Java版本1.6 +春季版本4.3.12)

  

注释org.springframework.web.bind.annotation.CrossOrigin是   失踪< clinit>

如何以最短的方式解决CORS问题?

P.S:当我从互联网选项打开CORS时,所有过程在IE中完美运行 - >安全 - >自定义级别 - >其他 - >跨域访问数据源(设置启用)

2 个答案:

答案 0 :(得分:1)

我将以下代码添加到unix WAS请求服务器中的virtualhost配置文件中,该服务器包含在spring框架中创建的restful webservices,它解决了我的问题。现在没有任何浏览器配置,我可以在客户端调用ajax函数而不会出现CORS问题。

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token, x-csrftoken"
Header always set Access-Control-Allow-Credentials "true"

如果您想深入了解该配置,可以访问that page这很有帮助。

答案 1 :(得分:0)

你添加了

吗?
$.ajax({
    ....
    xhrFields: {withCredentials: true},
    ....
}

在ajax方法中