Lorsque de nombreuses personnes utilisent AJAX pour appeler du contenu sur les sites d'autres personnes, JS affichera une erreur d'absence d'autorisation. Il s'agit d'une limitation du composant XMLHTTP - pour des raisons de sécurité.
Il est interdit d'accéder à des sites Web qui ne sont pas du même domaine. Voici un exemple pour accéder à http://www.google.cn,
<type de script=texte/javascript>
fonction createobj() {
si (window.ActiveXObject) {
renvoyer un nouvel ActiveXObject (Microsoft.XMLHTTP) ;
}
sinon si (window.XMLHttpRequest) {
renvoie un nouveau XMLHttpRequest();
}
}
fonction getWebPage(url) {
var oBao=createobj();
var mon_url=url
oBao.open('get',my_url,false);
oBao.onreadystatechange=fonction(){
si(oBao.readyState==4){
si(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}autre{
document.write(L'adresse que vous avez saisie n'a pas été trouvée ou erreur du serveur 505 !);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
Enregistrez ce code dans test.html et ouvrez-le localement avec IE sans aucun problème, mais après avoir téléchargé ce code sur le serveur, un problème se produit - JS ne demande aucune erreur d'autorisation !!! Comment résoudre ce problème ?
Pensons-y : puisque vous ne pouvez pas accéder à des adresses de domaine différent, vous ne pouvez accéder qu'aux adresses du même domaine. Comment les fichiers dynamiques du même domaine peuvent-ils obtenir le contenu de pages Web d'un domaine différent ? On pense encore à AJAX, mais cet AJAX est exécuté côté serveur.
L'idée générale est la suivante : soumettez d'abord l'URL à un fichier de votre propre site en utilisant AJAX, tel que getPage.asp --- dans getPage.asp, accédez à nouveau à l'URL soumise via le serveur XMLHTTP --- renvoyez le contenu obtenu au Page URL soumise ---- afficher le contenu
Commençons par organiser le code, en commençant par le fichier test.html
<type de script=texte/javascript>
fonction createobj() {
si (window.ActiveXObject) {
renvoyer un nouvel ActiveXObject (Microsoft.XMLHTTP) ;
}
sinon si (window.XMLHttpRequest) {
renvoie un nouveau XMLHttpRequest();
}
}
fonction getWebPage(url) {
var oBao=createobj();
var my_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=fonction(){
si(oBao.readyState==4){
si(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}autre{
document.write(L'adresse que vous avez saisie n'a pas été trouvée ou erreur du serveur 505 !);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
Ensuite, il y a le fichier getpage.asp (note : ce fichier doit être enregistré au format UTF-8 pour éviter les caractères tronqués), comme suit :
<%
réponse.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'Nom de la fonction : GetResStr
'Fonction : Récupère le code HTML de l'URL spécifiée
'Paramètres : URL-l'URL à obtenir
fonction GetResStr(URL)
err.clear
dim ResBody, ResStr, PageCode, ReturnStr
Définir Http=createobject(MiCROSOFT.XMLHTTP)
Http.open GET,URL,Faux
Http.Envoyer()
Si Http.Readystate =4 Alors
Si Http.status=200 Alors
ResStr=http.responseText
ResBody=http.responseBody
PageCode = GetCode (ResStr, reg)
ReturnStr=BytesToBstr(http.responseBody,PageCode)
GetResStr=ReturnStr
Fin si
Fin si
Fonction de fin
'Nom de la fonction : OctetsVersBstr
'Fonction : Convertir les données binaires en caractères
'Paramètres : données corps-binaires, méthode d'encodage Cset-texte
Fonction BytesToBstr(Corps,Cset)
Dim Objstream
Définir Objstream = CreateObject (adodb.stream)
objstream.Type = 1
objstream.Mode =3
objstream.Ouvrir
objstream.Écrire le corps
objstream.Position = 0
objstream.Type = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Fermer
définir objstream = rien
Fonction de fin
'Nom de la fonction : GetCode
'Fonction : Convertir le binaire en caractère
'Paramètres : chaîne str à interroger, expression régulière regstr
Fonction GetCode(str,regstr)
Dim Reg,serStr
set Reg = nouveau RegExp
Reg.IgnoreCase = Vrai
Reg.MultiLine = Vrai
Reg.Pattern =regstr
if Reg.test(str) then 'Si un élément correspondant est trouvé
Définir Cols = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) 'Utiliser la première correspondance trouvée
else 'Sinon, donnez la valeur par défaut gb2312, ce qui est un peu paresseux. Si la page ne donne pas le format d'encodage, c'est effectivement un peu gênant à connaître.
serStr=gb2312
finir si
GetCode=serStr
fonction de fin
faible url:url=request.querystring(url)
réponse.write GetResStr(URL)
%>
Le code a été organisé. Après expérimentation, le contenu de http://www.google.cn a été extrait avec succès !!!!! Cela résout le problème de l'absence d'autorisations.
En fait, un simple getpage.asp peut être obtenu, mais il ne peut pas traiter dynamiquement le DOM comme js.
Il existe un autre problème. Si vous utilisez la première méthode pour accéder à http://www.baidu.com, des caractères tronqués apparaîtront car le codage baidu est GB2312.
XMLHTTP renvoie le format de codage UTF-8. En utilisant la deuxième méthode, un tel problème ne se produira pas tant que le site qui définit le format de codage peut renvoyer les informations normalement (cela n'inclut pas certains sites qui utilisent un codage spécial).