Cuando muchas personas usan AJAX para llamar contenido en los sitios de otras personas, JS mostrará un error de no permiso. Esta es una limitación del componente XMLHTTP, por razones de seguridad.
Está prohibido acceder a sitios web que no sean del mismo dominio. Aquí hay un ejemplo para acceder a http://www.google.cn.
<tipo de script=texto/javascript>
función crearobj() {
si (ventana.ActiveXObject) {
devolver nuevo ActiveXObject (Microsoft.XMLHTTP);
}
de lo contrario si (ventana.XMLHttpRequest) {
devolver nuevo XMLHttpRequest();
}
}
función getPáginaWeb(url) {
var oBao=createobj();
var mi_url=url
oBao.open('get',my_url,false);
oBao.onreadystatechange=función(){
si(oBao.readyState==4){
si(oBao.status==200){
var returnStr=oBao.responseText;
documento.write(returnStr);
}demás{
document.write(¡No se encontró la dirección que ingresó o error 505 del servidor!);
}
}
}
oBao.send(nulo);
}
getWebPage('http://www.google.cn');
</script>
Guarde este código en test.html y ábralo localmente con IE sin ningún problema, pero después de cargar este código en el servidor, ocurre un problema: ¡JS muestra un error sin permiso!
Pensémoslo: dado que no puede acceder a direcciones que no sean del mismo dominio, solo puede acceder a direcciones en el mismo dominio. ¿Cómo pueden los archivos dinámicos en el mismo dominio obtener el contenido de páginas web en el mismo dominio? Todavía pensamos en AJAX, pero este AJAX se ejecuta en el lado del servidor.
La idea general es la siguiente: primero envíe la URL a un archivo en su propio sitio usando AJAX, como getPage.asp---en getPage.asp, acceda nuevamente a la URL enviada a través del servidor XMLHTTP---devuelva el contenido obtenido al Página URL enviada----mostrar contenido
Comencemos a organizar el código, comenzando con el archivo test.html.
<tipo de script=texto/javascript>
función crearobj() {
si (ventana.ActiveXObject) {
devolver nuevo ActiveXObject (Microsoft.XMLHTTP);
}
de lo contrario si (ventana.XMLHttpRequest) {
devolver nuevo XMLHttpRequest();
}
}
función getPáginaWeb(url) {
var oBao=createobj();
var my_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=función(){
si(oBao.readyState==4){
si(oBao.status==200){
var returnStr=oBao.responseText;
documento.write(returnStr);
}demás{
document.write(¡No se encontró la dirección que ingresó o error 505 del servidor!);
}
}
}
oBao.send(nulo);
}
getWebPage('http://www.google.cn');
</script>
Luego está el archivo getpage.asp (nota: este archivo debe guardarse en formato UTF-8 para evitar caracteres confusos), de la siguiente manera:
<%
respuesta.charset=UTF-8
reg=/<meta.+ juego de caracteres= {0,}([^/ />//]*).+//{0,1}/>
'Nombre de la función: GetResStr
'Función: Obtener el código HTML de la URL especificada
'Parámetros: URL: la URL que se obtendrá
función GetResStr(URL)
errar.claro
tenue ResBody,ResStr,PageCode,ReturnStr
Establecer Http=crearobjeto(MiCROSOFT.XMLHTTP)
Http.open OBTENER, URL, Falso
Http.Enviar()
Si Http.Readystate = 4 Entonces
Si Http.status = 200 entonces
ResStr=http.responseText
ResBody=http.responseBody
Código de página = Obtener código (ResStr, reg)
ReturnStr=BytesToBstr(http.responseBody,PageCode)
GetResStr=RetornoStr
Terminar si
Terminar si
Función final
'Nombre de la función:BytesToBstr
'Función: Convertir datos binarios a caracteres
'Parámetros: datos binarios del cuerpo, método de codificación de texto Cset
Función BytesToBstr(Cuerpo,Cset)
Corriente de objetos tenue
Establecer Objstream = CreateObject(adodb.stream)
objstream.Tipo = 1
objstream.Modo =3
objstream.Abrir
objstream.Escribir cuerpo
objstream.Posición = 0
objstream.Tipo = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Cerrar
establecer objstream = nada
Función final
'Nombre de la función: GetCode
'Función: Convertir binario a carácter
'Parámetros: str-string a consultar, regstr-expresión regular
Función GetCode(cadena,regstr)
Reg tenue, serStr
establecer Reg = nueva RegExp
Reg.IgnoreCase = Verdadero
Reg.MultiLine = Verdadero
Patrón de registro = regstr
si Reg.test(str) entonces 'Si se encuentra un elemento coincidente
Establecer columnas = Reg.Execute(cadena)
serStr=Cols(0).SubMatches(0) 'Usa la primera coincidencia encontrada
de lo contrario, proporcione el valor predeterminado gb2312, que es un poco vago. Si la página no proporciona el formato de codificación, es un poco problemático saberlo.
serStr=gb2312
terminar si
GetCode=serStr
función final
URL tenue: URL = solicitud.cadena de consulta (URL)
respuesta.escribir GetResStr(URL)
%>
¡El código se organizó después de experimentar y el contenido de http://www.google.cn se extrajo con éxito! ¡Esto resuelve el problema de la falta de permisos!
De hecho, se puede obtener un getpage.asp simple, pero no puede procesar dinámicamente el DOM como js.
Hay otro problema si utiliza el primer método para acceder a http://www.baidu.com, aparecerán caracteres confusos porque la codificación de baidu es GB2312.
XMLHTTP devuelve el formato de codificación UTF-8. Con el segundo método, este problema no ocurrirá siempre que el sitio que define el formato de codificación pueda devolver información normalmente (esto no incluye algunos sitios que usan codificación especial).