这是我的问题:我正在开发一个可以通过轮询来检索动态数据的系统。它在 Grails 中,当我对某个控制器操作发出请求时,例如“ http://localhost:8080/foo/bar ”,将返回一个包含最新数据的 JSON 列表。
为了增加安全性和功能,我使用 Spring Security(Grails Acegi 插件)保护了我的页面,并启用了基本身份验证。当您登录时,系统会自动加载有关您的用户配置文件的信息,并更改返回的数据。因此,身份验证是强制性的。
这有效:我可以从任何浏览器轮询我的操作,并且将返回数据。我的 Grails 应用程序中有一个调用此 URL 的 JavaScript 脚本。
问题是我想将我的 JavaScript 脚本外部化以将其分发给客户,这样他们就可以构建自己的 HTML 文件,插入我的 JavaScript 文件,并能够使用 AJAX 访问我的数据(有点像 API)。像这样:
$.ajax(url: urlWithParams,
method: 'GET',
beforeLoad: function(xhr) {
xhr.setRequestHeader('Authorization', authString);
},
success: myFunction
});
但是,它不起作用。首先,我知道跨域 GET 请求很棘手。但在我的情况下,我使用基本身份验证,这更棘手,因为我需要将凭据直接放入 XmlHttpRequest 中,这会在 Firefox 中生成预检请求(用 OPTIONS 替换 GET),而我的 Grails 应用程序不处理它.
我的问题非常具体。我使用基本身份验证来防止恶意访问,但是由于一些跨域限制,我无法使用正确的凭据访问我的应用程序!
我该怎么办!我尝试使用 IFrame,但无法获取页面内容(我收到“拒绝访问”错误 - 又是跨域限制)。
此外,ajax() 函数中的 jQuery 用户名和密码字段也不起作用。
我可以在未受保护的页面上执行简单的 AJAX GET 请求,将凭据作为参数发送,然后页面将使用凭据重定向到受保护的页面吗?浏览器不会破坏请求,但我可以使用基本身份验证凭据进行重定向吗?
我感觉它不起作用(与重定向有关,它会生成一个新的请求,等等......)。我是对的,还是应该起作用?
JSONP 能解决这个问题吗?我不知道如何使用 JSONP 集成基本身份验证,但是......
非常感谢你!