我已经构建了Spring MVC的REST API后端,并使用Spring Security基本身份验证进行了安全保护。JQuery跨域基本认证调用
我想从JavaScript客户端跨域Ajax调用REST API。我不想使用JSONP,因为我不想限制GET调用。我使用CORS,并将正确的标题放在服务器端。
假设我的REST API位于域localhost:8087上,并且我的客户端位于localhost:8086上,这是跨域调用。
在我的JavaScript客户端,我做的AJAX调用使用jQuery:
<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错误。
当我尝试从相同的域本地主机:8087,这是不是跨域的脚本了,我没有问题。
这怎么可能?
我的脚本只是一个测试。我不打算把我的用户名/密码放在客户端。但是我想测试如何对基本的auth保护的REST API执行ajax调用。我想我必须在服务器端发送安全的用户名/密码,REST API会将我发回给我一个cookie,并且我不需要再通过用户名/密码来接收我对REST API的下一个ajax调用。我对吗 ?
我已经使用Chrome高级REST客户端测试了我的REST API,它的工作方式与此类似。对于我需要传递授权标头的第一个请求。然后它不是必需的。它应该像我的JavaScript网络客户端那样工作吗?我打算使用Node.JS和Backbone来构建它。
非常感谢。
EDIT2:似乎真的是一个CORS浏览器问题。我在服务器端为OPTIONS方法添加了头部访问控制 - 允许 - 方法,它可以在Chrome上运行。我有权访问JSON响应,而不再有错误。但我仍然需要为下一个请求使用授权标头。如何告诉jQuery使用发送的cookie?
当我与Firefox 11尝试,我必须JSON响应进不去,我有错误:
"NetworkError: 401 Non-Autorisé - http://localhost:8087/SpringMVC/users/user1"
你是base64编码你的用户名/密码? – 2012-04-08 14:59:21
是的,我把它xxxxxxxx而不是真正的用户名:密码。 – rico 2012-04-08 15:15:25