1、此計算機上的安全設置禁止訪問其它域的數據源,怎麼解決?
獲取同一個域的數據,可以通過XMLHTTP組件或IFRAME來實現,不存在跨域訪問的許可權問題,因此比較簡單。
但如果要訪問不同域的數據時,由於瀏覽器的安全設置,XMLHTTP沒有許可權獲取數據,而IFRAME沒有許可權將獲取的數據傳遞給父窗口,似乎沒有其它解決辦法。
在網上提到的方法,不外乎這兩種:
1. 如果要獲取的數據位於同一個根域但是不同子域時,可以在腳本中指定document.domain為父域。
2. 如果要獲取的數據位於不同的根域時,則可以在伺服器上寫一個腳本作為代理,由伺服器上的腳本獲取不同域的數據,然後傳遞給在同一個域中的網頁。
以上兩種方法很容易便能想到,現在的問題是,如果要獲取一個不同根域的數據時,該如何實現?
一般我們不會漫無目的地去網上獲取數據,往往是從指定的伺服器上獲取數據,就像Google Maps、Google Adsense和referer這樣的網頁插件,一般都是以腳本的形式提供給用戶使用的。這時,如果要求用戶在自己的伺服器上寫個代理的話,易用性就要大打折扣。獲取你會考慮為用戶寫好各種腳本的代理,PHP、ASP、Python、Perl……,但是,如果這台伺服器不支持動態腳本,又該怎麼辦呢?
想了兩天都沒想通這個問題(除去上班時間其實不到兩個小時),曾考慮過用瀏覽器的漏洞來實現,但是這樣做不能長久,因此放棄。隨後發現Google本地搜索的地圖數據來自於mapabc.com,好傢伙,他們是怎麼辦到的?
用FireFox的DOM查看器可以看到,地圖區是一個IFRAME,難道是用IFRAME實現的?但是拖動地圖時如何知道要下載哪些圖片的?這些數據是一定要從伺服器上獲取的,難道放這些數據的伺服器也是google.com域內的?應該不會這么麻煩。
隨即找來Google Maps的API進行開刀,官網給的範例網頁如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps JavaScript API Example</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=abcdefg"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
}
}
//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 500px; height: 300px"></div>
</body>
</html>
把http://maps.google.com/maps?file=api&v=2&key=abcdefg下載下來看了一下,裡面有一句:
GScript("http://maps.google.com/mapfiles/maps2.67.api.js");
這句就是用來載入地圖操作庫的,GScript函數定義為:
function GScript(src) {document.write('');}
頓悟……
網頁內引用不同域的腳本並不會提示許可權不足,對了,就是它沒錯!
這個方法其實我早應該想到的,可能是太久沒玩javascript的緣故吧。不論是referer還是Google Analytics,要統計頁面訪問信息,都要用腳本來向伺服器提交信息,只是它們只提交一次(Google Analytics有統計逗留時間,應該有好幾次)。習慣性地,我把提交和下載數據分開了,所以不容易想到這個方法。
但是用document.write始終不是好辦法,它會清除頁面上原有的內容。改進的方法估計你已經想到了,可以參考一下我很早以前亂寫的這篇文章《有效地組織頁面中復雜的JavaScript腳本》里的思想。
繼續分析Google Maps的代碼,打開http://maps.google.com/mapfiles/maps2.67.api.js,裡面有這樣的代碼:
ta.prototype.Hk=function(a,b){var c=this.ql(a);if(c){window.setTimeout(function(){b(c)},
0)}else{var d="__cg"+Zf++ +(new Date).getTime();
try{if(this.qe==null){this.qe=document.getElementsByTagName("head")[0]}
var e=window.setTimeout(sd(d,b,a,403),15000);
if(!window.__geoStore){window.__geoStore={}}window.__geoStore[d]=Jf(this,d,b,e);
var f=document.createElement("script");f.type="text/javascript";
f.id=d;f.charset="UTF-8";
f.src=this.vl+"?q="+window.encodeURIComponent(a)+"&output=json&callback=__geoStore."+d+"&key="+this.Lh;
this.qe.appendChild(f)}catch(g){if(e){window.clearTimeout(e)}window.setTimeout(sd(d,
b,a,500),0)}}};
script節點也是動態創建的,這樣就可以避免document.write產生的問題。
解決方法找到了,現在來簡單測試一下:
1. 在本地伺服器上新建一頁面。
test.html:
<html>
<head>
<title> Over-Domain Data Fetching Test Page</title>
<script type="text/javascript">
var lastScript;
var h=document.getElementsByTagName("head")[0];</code>
function loadScript(url){
var f=document.createElement("script");
var d=new Date().getTime();
f.type="text/javascript";
f.id=d;
f.src=url+'?'+d;
h.appendChild(f);
if(lastScript&&g(lastScript))g(lastScript).parentNode.removeChild(g(lastScript));
lastScript=d;
}
function g(x){return document.getElementById(x)};
</script>
</head>
<body>
<button onclick="loadScript('http://localhost/alert.js')">Test Alert</button><br />
<button onclick="loadScript('http://localhost/info.js')">Get My Info</button><br />
My Name: <input id="myname" type="text" value="" /><br />
My Blog: <input id="myblog" type="text" value="" />
</body>
</html>
解釋兩個關鍵點:
1. lastScript用於存放上次建立的script節點的ID,在下次要再新建script節點時,要刪除上次建立的節點,以免載入的腳本越來越多,佔用過多的內存。
2. url後面加了一個數值d是為了防止瀏覽器緩存腳本數據,在本例中可以不加,但是如果腳本是由伺服器動態生成的,那最好加上。
然後再建立兩個javascript腳本用於測試:
alert.js:
alert('You can see me!');
info.js:
g('myname').value='Hily Jiang';
g('myblog').value='http://hily.iyi.cn/';
好了,把它們放在本地伺服器的根目錄下,敲入http://127.0.0.1/test.html,這樣它和localhost就不在同一個域內了。
點擊「Test Alert」,應該會彈出對話框顯示You can see me!。
點擊「Get My Info」,應該會在文本框中顯示我的信息
2、假如我有個二級域名為jj.360.com,那麼我能夠自己買一個域名然後canme解析到這個域名嗎
解析是可以解析,還有關鍵的一點,你解析的域名還得能夠綁定才可以,不然 ,自己買的域名還是訪問不了。
3、.me 是哪裡的域名
ME域名是歐洲南部國家黑山,最近剛向全世界用戶公開的頂級域名的注冊權,各界都對它非常期待。國內注冊服務一開始,就引發搶注熱。
任何人都可以注冊,但是注冊人務必確保注冊信息的完整和真實。
對於企業而言,「ME」的中文意思為「我」,象徵著以人為本。因此,.ME域名無論從哪個角度,都沒有理由不及時搶注。先人一步,才能保護好品牌,才能從最新潮的角度開辟網路營銷的藍海!
4、You can call me( ) 1347725,填什麼?
at
=)
5、之前看過你回答網站備案的問題,想問一下,備案期間可以使用三級域名么?二級域名或者canme訪問可以么?
不可以的哦,我們公司是接入商,不管什麼域名,只要是頂級的域名備案,網站都必須關閉。要不然永遠下不來號
6、can″protect♂%me,,,,是什麼意思?
能夠保護我。
親:高老師祝你學習進步,每天都開心V_V!
望採納,thanks!
7、如何將不帶www的根域名跳轉到帶www的主域名上
A記錄或者CANME記錄解析那裡填@就是根域名解析
8、.me域名能轉入阿里雲嗎?
由於抄工業和信息化部在2017年底發布了關襲於規范互聯網信息服務使用域名的通知,2018年01月開始執行,國內有具有CNNIC認證的注冊機構只允許提供通過了批復的後綴,阿里雲原來是可以轉入和新注冊me域名的,不過現在下架了,但你可以發服務單請求客服協助轉入,你可以嘗試一下!
9、什麼是ME域名,為什麼注冊ME域名
域名續費需要到購買時的注冊商那裡續費,除非您已將域名轉出,才可以到新域名商處續費。