我想从JavaScript客户端对REST API进行跨域ajax调用.我不想使用JSONP,因为我不想限于GET调用.我使用CORS我已经把正确的标题在服务器端.
假设我的REST API在域localhost:8087和我的客户端在localhost:8086,这是跨域调用.
在我的Javascript客户端,我使用jQuery进行ajax调用:
<script> $.ajax ({ url: "http://localhost:8087/SpringMVC/users/user1",beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization","Basic xxxxxxxxxxxx"); },success: function(val) { console.log(val); alert("success" + val); },error: function(val) { console.log(val); alert("error" + val); } }); </script>
我的问题是jQuery不会在HTTP请求中发送授权头,我不知道为什么.我不明白,因为我在beforeSend方法,所以它应该在HTTP请求内.结果:我有一个401错误.
当我尝试从同一个域localhost:8087的脚本,这不是跨域,我没有问题.
这怎么可能 ?
我的脚本只是一个测试.我不打算把我的用户名/密码放在客户端.但是我想测试如何对基本的受保护的REST API进行ajax调用.我想我必须在服务器端发送安全的我的用户名/密码,REST API发回我的一个cookie,我不需要传递用户名/密码,我的下一个ajax调用REST API.我对吗 ?
我已经使用Chrome Advanced REST客户端测试了我的REST API,它正在这样工作.对于第一个请求,我需要传递授权头.那就不需要了它应该与我的JavaScript网络客户端一样吗?我打算使用Node.JS与Backbone来构建它.
非常感谢.
EDIT2似乎是一个CORS浏览器问题.我在服务器端添加了用于OPTIONS方法的Access-Control-Allow-Methods标头,它在Chrome上可以工作.我可以访问JSON响应,没有任何错误.但是我仍然需要为下一个请求使用授权头.如何告诉jQuery使用cookie发送?
当我尝试使用Firefox 11时,我没有访问json响应,我有错误:
"NetworkError: 401 Non-Autorisé - http://localhost:8087/SpringMVC/users/user1"
解决方法
在进行跨域请求之前,他们使用HTTP OPTIONS方法执行所谓的“预检”请求. Chrome和Firefox之间的区别在于,Chrome还会发送授权标题与凭据,而Firefox不会.
那么它仍然是一个Spring Security配置问题.我的url / users / *是安全的所有HTTP方法,包括OPTIONS.在Firefox的情况下,由于授权标头未发送,我的请求未被授权.如果我仅将我的安全网址/用户/ *限制为GET方法,那么它完全适用于Firefox.所以我只需要添加在我的Spring安全配置中:
<intercept-url pattern="/users/*" access="isAuthenticated()" method="GET"/>
之后,我有选择:我可以添加其他方法来保护在拦截网址,除了OPTIONS,否则我可以限制在我的Spring MVC控制器中HTTP方法调用GET,甚至可以根据的Javadoc.我选择了第二个解决方案.但是如果有人找到解决方案来强制Firefox发送诸如Chrome的凭据,那么这将是非常好的选择.