我已经使用 Spring MVC 构建了一个 REST API 后端,并使用 Spring Security 使用基本身份验证进行保护。
我想从 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 请求中发送 Authorization 标头,我不知道为什么。我不明白,因为我是在 beforeSend 方法中做的,所以它应该在 HTTP 请求中。结果:我有一个 401 错误。
当我从同一个域 localhost:8087(不再是跨域)尝试脚本时,我没有问题。
这怎么可能 ?
我的脚本只是一个测试。我不打算将我的用户名/密码放在客户端。但我想测试如何对基本的身份验证保护的 REST API 进行 ajax 调用。我想我必须在服务器端发送以确保我的用户名/密码的安全,REST API 向我发送回一个 cookie,并且我不需要再将用户名/密码传递给我的下一个 ajax 调用到 REST API。我对吗 ?
我已经用 Chrome Advanced REST 客户端测试了我的 REST API,它的工作原理就是这样。对于第一个请求,我需要传递授权标头。然后就不需要了。我的 javascript Web 客户端也应该这样工作吗?我打算使用带有 Backbone 的 Node.JS 来构建它。
非常感谢。
EDIT2:似乎真的是一个CORS浏览器问题。我在服务器端为 OPTIONS 方法添加了标题 Access-Control-Allow-Methods,它适用于 Chrome。我可以毫无错误地访问 JSON 响应。但我仍然需要为下一个请求使用授权标头。如何告诉 jQuery 使用发送的 cookie?
当我尝试使用 Firefox 11 时,我无法访问 json 响应并且出现错误:
"NetworkError: 401 Non-Autorisé - http://localhost:8087/SpringMVC/users/user1"