避免跨域問題的常用方法是注入標籤。像圖片或腳本這樣的標籤可以從任何域加載它們的內容。你可以注入,比如說類型爲「text/x-unknown」的腳本標記或者其他的東西,然後監聽標籤加載事件。當加載事件觸發時,您可以再次從頁面中刪除腳本標記。
當然,如果你正在尋找的文件恰好是圖像,那麼你可以改爲new Image()
。這樣,您不必通過注入標籤來污染頁面,因爲圖像在創建時會加載(可用於預加載圖像)。再次,等待圖像上的加載事件。
UPDATE
好吧,看來我過早下結論這裏。瀏覽器之間在如何支持這方面存在一些差異。以下是一個完整的示例,介紹如何使用腳本標記驗證IE9和最新版本的Firefox,Chrome和Safari中的URL。
它不適用於舊版本的IE(至少IE8),因爲顯然它們不提供腳本標籤的加載/錯誤事件。
如果腳本標記的contenttype不爲空或設置爲「text/javascript」,Firefox拒絕加載任何內容。這意味着使用這種方法檢查腳本文件可能有點危險。好像之前在我的測試中執行任何代碼腳本標記將被刪除,但我肯定不...
不管怎麼說,這裏是代碼:
<!doctype html>
<html>
<head>
<script>
function checkResource(url, callback) {
var tag = document.createElement('script');
tag.src = url;
//tag.type = 'application/x-unknown';
tag.async = true;
tag.onload = function (e) {
document.getElementsByTagName('head')[0].removeChild(tag);
callback(url, true);
}
tag.onerror = function (e) {
document.getElementsByTagName('head')[0].removeChild(tag);
callback(url, false);
}
document.getElementsByTagName('head')[0].appendChild(tag);
}
</script>
</head>
<body>
<h1>Testing something</h1>
<p>Here is some text. Something. Something else.</p>
<script>
checkResource("http://google.com", function (url, state) { alert(url + ' - ' + state) });
checkResource("http://www.google.com/this-does-not-exists", function (url, state) { alert(url + ' - ' + state) });
checkResource("www.asdaweltiukljlkjlkjlkjlwew.com/does-not-exists", function (url, state) { alert(url + ' - ' + state) });
</script>
</body>
</html>
來源
2011-09-30 10:40:15
AHM
正如我說我的服務器使用一個代理,所以當我在URL構造函數中創建指定代理的HttpURLConnection時,它工作正常,但對於https連接,我再次遇到問題。由於HttpsURLConnection con =(HttpsURLConnection)url.openConnection(); - 不起作用,僅適用於HttpURLConnection。 那麼,如何實現這個簡單的事情呢? – user972810
http://stackoverflow.com/questions/1511674/how-do-a-send-an-https-request-through-a-proxy-in-java可能會有所幫助。它仍然聽起來不那麼直截了當。 – alnorth29
我不認爲由URL的openConnection()返回的對象可以被類型轉換爲HttpsURLConnection;雖然它可以被鑄造成HttpURLConnection,但是HttpsURLConnection連接=(HttpsURLConnection)url.openConnection(); 此外,我更感興趣的瀏覽器端驗證,所以我不必去這些代理設置。 – user972810