JQuery跨域基本认证调用

前端之家收集整理的这篇文章主要介绍了JQuery跨域基本认证调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经使用 Spring MVC构建了一个REST API后端,并使用Spring Security的基本Auth进行安全保护.

我想从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"

解决方法

显然,Chrome和Firefox对Cross Domain请求有所不同.
在进行跨域请求之前,他们使用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的凭据,那么这将是非常好的选择.

猜你在找的jQuery相关文章