Wenn viele Leute AJAX verwenden, um Inhalte auf den Websites anderer Leute aufzurufen, wird JS einen Fehler ohne Berechtigung auslösen. Dies ist eine Einschränkung der XMLHTTP-Komponente – aus Sicherheitsgründen
Es ist verboten, auf Websites zuzugreifen, die nicht derselben Domain angehören. Hier ist ein Beispiel für den Zugriff auf http://www.google.cn.
<script type=text/javascript>
Funktion createobj() {
if (window.ActiveXObject) {
return new ActiveXObject(Microsoft.XMLHTTP);
}
sonst wenn (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
}
Funktion getWebPage(url) {
var oBao=createobj();
var my_url=URL
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}anders{
document.write(Die von Ihnen eingegebene Adresse wurde nicht gefunden oder Serverfehler 505!);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
Speichern Sie diesen Code in test.html und öffnen Sie ihn problemlos lokal mit dem IE. Nach dem Hochladen dieses Codes auf den Server tritt jedoch ein Problem auf: JS meldet keinen Berechtigungsfehler!!!
Denken wir einmal darüber nach: Da Sie nicht auf Adressen in unterschiedlichen Domänen zugreifen können, können Sie nur auf Adressen in derselben Domäne zugreifen. Wie können dynamische Dateien in derselben Domäne den Inhalt von Webseiten in nicht derselben Domäne abrufen? Wir denken immer noch an AJAX, aber dieses AJAX wird serverseitig ausgeführt.
Die allgemeine Idee ist folgende: Senden Sie zunächst die URL mithilfe von AJAX an eine Datei auf Ihrer eigenen Website, z. B. getPage.asp. Greifen Sie in getPage.asp erneut über den XMLHTTP-Server auf die übermittelte URL zu und geben Sie den erhaltenen Inhalt an den zurück Eingereichte URL-Seite ----Inhalt anzeigen
Beginnen wir mit der Organisation des Codes, beginnend mit der Datei test.html
<script type=text/javascript>
Funktion createobj() {
if (window.ActiveXObject) {
return new ActiveXObject(Microsoft.XMLHTTP);
}
sonst wenn (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
}
Funktion getWebPage(url) {
var oBao=createobj();
var my_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}anders{
document.write(Die von Ihnen eingegebene Adresse wurde nicht gefunden oder Serverfehler 505!);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
Dann gibt es noch die Datei getpage.asp (Hinweis: Diese Datei muss im UTF-8-Format gespeichert werden, um verstümmelte Zeichen zu vermeiden):
<%
Antwort.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'Funktionsname: GetResStr
'Funktion: Den HTML-Code der angegebenen URL abrufen
'Parameter: URL – die abzurufende URL
Funktion GetResStr(URL)
irr.klar
dim ResBody,ResStr,PageCode,ReturnStr
Setze Http=createobject(MiCROSOFT.XMLHTTP)
Http.open GET,URL,False
Http.Send()
Wenn Http.Readystate =4, dann
Wenn Http.status=200, dann
ResStr=http.responseText
ResBody=http.responseBody
PageCode=GetCode(ResStr,reg)
ReturnStr=BytesToBstr(http.responseBody,PageCode)
GetResStr=ReturnStr
Ende wenn
Ende wenn
Funktion beenden
'Funktionsname:BytesToBstr
'Funktion: Binärdaten in Zeichen umwandeln
'Parameter: Body-Binärdaten, Cset-Text-Kodierungsmethode
Funktion BytesToBstr(Body,Cset)
Dim Objstream
Setze Objstream = CreateObject(adodb.stream)
objstream.Type = 1
objstream.Mode =3
objstream.Öffnen
objstream.Text schreiben
objstream.Position = 0
objstream.Type = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Schließen
set objstream = nichts
Funktion beenden
'Funktionsname: GetCode
'Funktion: Binär in Zeichen umwandeln
'Parameter: abzufragender str-String, regstr-regulärer Ausdruck
Funktion GetCode(str,regstr)
Dim Reg,serStr
set Reg= new RegExp
Reg.IgnoreCase = True
Reg.MultiLine = True
Reg.Pattern =regstr
if Reg.test(str) then 'Wenn ein passendes Element gefunden wird
Set Cols = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) 'Verwende die erste gefundene Übereinstimmung
else 'Andernfalls geben Sie den Standardwert gb2312 an, was etwas faul ist. Wenn die Seite das Codierungsformat nicht angibt, ist es in der Tat etwas mühsam, es zu wissen.
serStr=gb2312
Ende wenn
GetCode=serStr
Endfunktion
dim url:url=request.querystring(url)
Response.write GetResStr(URL)
%>
Der Code wurde organisiert. Nach dem Experimentieren wurde der Inhalt von http://www.google.cn erfolgreich extrahiert!!!!!
Tatsächlich kann ein einfaches getpage.asp abgerufen werden, das DOM kann jedoch nicht wie js dynamisch verarbeitet werden.
Es gibt ein weiteres Problem. Wenn Sie die erste Methode verwenden, um auf http://www.baidu.com zuzugreifen, werden verstümmelte Zeichen angezeigt, da die Baidu-Kodierung GB2312 ist.
XMLHTTP gibt das UTF-8-Codierungsformat zurück. Bei Verwendung der zweiten Methode tritt ein solches Problem nicht auf, solange die Site, die das Codierungsformat definiert, Informationen normal zurückgeben kann (dies gilt nicht für einige Sites, die eine spezielle Codierung verwenden).