研究 XMLHttpRequest 時,改了半天還是弄不起來,老是出現 “Error: uncaught exception: Permission denied to call method XMLHttpRequest.open
“,用 Google 找半天看不出什麼原因,只看出跟安全性問題有關,但是也沒有說要怎麼解決。
想了一陣子才想到我這邊使用 XMLHttpRequest.open() 時是去 Flickr API (www.flickr.com) 抓,而不是同一個 site 下面的 url,把 url 改回同個 site 下面就馬上 okay 了。
於是我就試看看:用 Redirect 把某個目錄的 URL 導到 Flickr API,結果發現 XMLHttpRequest 居然抓到 Redirect 的頁面而不是 Flickr API…
這樣就很奇怪了:那我之前看到的 LfVr 是怎麼做到的?突然想到 LfVr 似乎是用 FlickrJS (參考 Flickr API 上 LfVr – a Lightweight flickr Viewer 的說明),於是跑去抓 FlickrJS 0.5 下來看,發現…
/*
* flickr.proxy.php,
* this is an interface between the Flickr API wrapper
* and the REST methods from flickr.com
原來大家的做法都一樣,都是寫一個 flickr.proxy.php 之類的東西過一次水,然後再透過 cache 加速… *boom*
您的觀察沒錯, 的確是瀏覽器的安全性問題, httpRequest 不能連去不同 domain 抓資料.
LfVr 需要用 FlickrJS 的 proxy, 不過這樣也好, 可以把 cache 實作進去, 因為 Flickr API 有時候回應還真的挺慢的.
由于安全原因,XMLHttpRequest不能cross domain,我找到了解决方案:方法一,用Apache mod_rewrite把other domian的RSS重写成本地的,这需要配置服务器,比较麻烦,不通用。方法二,用ASP、.Net、PHP、JSP、Perl写一个Proxy脚本。