2010-08-03 73 views
2

這是我的問題:我正在開發一個可以輪詢檢索動態數據的系統。它在Grails中,當我對某個控制器操作發出請求時,說「http://localhost:8080/foo/bar」,返回包含最新數據的JSON列表。跨域使用jQuery的基本認證

爲了增加安全性和功能,我使用Spring Security(Grails Acegi插件)保護了我的頁面,並啓用了基本身份驗證。登錄時,系統會自動加載關於用戶配置文件的信息,並更改返回的數據。所以,認證是強制性的。

這個作品:我可以從任何瀏覽器輪詢我的動作,並且數據將被返回。我在我的Grails應用程序中有一個JavaScript腳本調用這個URL。

問題是,我想將我的JavaScript腳本外部化以將其分發給客戶,以便他們可以構建自己的HTML文件,插入我的JavaScript文件並能夠訪問我的數據(類似於API )使用AJAX。像這樣:

$.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集成基本認證,但是...

非常感謝!

回答

1

我用JSONP解決了我的問題。我修改了我的應用程序,因此不需要對AJAX調用進行基本的認證。 jQuery的$ .getJSON()方法取得了訣竅。

+2

你的問題很好,但這是一個可怕的答案。如果請求是通過'getJSON'完成的,你只需簡單地禁用認證? – 2010-09-02 20:10:22

+0

是否有人知道它是否儘可能使用基本身份驗證對其他域API執行AJAX調用?以前,我使用libcurl來做到這一點,但鉻擴展不允許運行PHP! – 2011-02-02 20:43:36