Когда многие люди используют AJAX для вызова контента на сайтах других людей, JS выдает ошибку отсутствия разрешения. Это ограничение компонента XMLHTTP — по соображениям безопасности.
Запрещен доступ к веб-сайтам, не принадлежащим к тому же домену. Вот пример доступа к http://www.google.cn.
<тип сценария=текст/javascript>
функция createobj() {
если (window.ActiveXObject) {
вернуть новый ActiveXObject(Microsoft.XMLHTTP);
}
иначе, если (window.XMLHttpRequest) {
вернуть новый XMLHttpRequest();
}
}
функция getWebPage (url) {
вар oBao=createobj();
вар my_url=url
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
если (oBao.readyState == 4) {
если(oBao.status==200){
вар returnStr=oBao.responseText;
document.write(returnStr);
}еще{
document.write(Введенный вами адрес не найден или ошибка сервера 505!);
}
}
}
oBao.send(ноль);
}
getWebPage('http://www.google.cn');
</скрипт>
Сохраните этот код в test.html и без проблем откройте его локально в IE, но после загрузки этого кода на сервер возникает проблема - JS не выдает ошибку разрешения!!! Как это решить?
Давайте подумаем: поскольку вы не можете получить доступ к адресам разных доменов, вы можете получить доступ только к адресам в одном домене. Как динамические файлы в одном домене могут получать содержимое веб-страниц в другом домене? Мы все еще думаем об AJAX, но этот AJAX выполняется на стороне сервера.
Общая идея такова: сначала отправьте URL-адрес в файл на вашем собственном сайте с помощью AJAX, например getPage.asp --- в getPage.asp снова получите доступ к отправленному URL-адресу через сервер XMLHTTP --- верните полученное содержимое в отправленная URL-страница ---- отображение содержимого
Начнем с организации кода, начиная с файла test.html.
<тип сценария=текст/javascript>
функция createobj() {
если (window.ActiveXObject) {
вернуть новый ActiveXObject(Microsoft.XMLHTTP);
}
иначе, если (window.XMLHttpRequest) {
вернуть новый XMLHttpRequest();
}
}
функция getWebPage (url) {
вар oBao=createobj();
вар my_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
если (oBao.readyState == 4) {
если(oBao.status==200){
вар returnStr=oBao.responseText;
document.write(returnStr);
}еще{
document.write(Введенный вами адрес не найден или ошибка сервера 505!);
}
}
}
oBao.send(ноль);
}
getWebPage('http://www.google.cn');
</скрипт>
Далее следует файл getpage.asp (примечание: этот файл необходимо сохранить в формате UTF-8, чтобы предотвратить искажение символов):
<%
response.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'Имя функции: GetResStr
'Функция: Получить HTML-код указанного URL-адреса.
'Параметры: URL-адрес, который необходимо получить
функция GetResStr(URL)
ошибка.очистить
dim ResBody,ResStr,PageCode,ReturnStr
Установите Http=createobject(MiCROSOFT.XMLHTTP)
Http.open GET,URL,False
HTTP.Отправить()
Если Http.Readystate = 4 Тогда
Если Http.status=200 Тогда
ResStr=http.responseText
ResBody=http.responseBody
PageCode=GetCode(ResStr,reg)
ReturnStr=BytesToBstr(http.responseBody,PageCode)
GetResStr=ReturnStr
Конец, если
Конец, если
Конечная функция
'Имя функции: BytesToBstr
'Функция: конвертировать двоичные данные в символы
'Параметры: двоичные данные тела, метод кодирования текста Cset.
Функция BytesToBstr(Body,Cset)
Дим Обжстрим
Установите Objstream = CreateObject(adodb.stream)
objstream.Type = 1
objstream.Mode =3
objstream.Открыть
objstream.Напишите тело
objstream.Position = 0
objstream.Type = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Close
установить objstream = ничего
Конечная функция
'Имя функции: GetCode
'Функция: конвертировать двоичный код в символьный
'Параметры: строка-строка для запроса, регулярное выражение regstr
Функция GetCode(str,regstr)
Дим Рег,serStr
установить Reg= новое RegExp
Reg.IgnoreCase = Истина
Reg.MultiLine = Истина
Reg.Pattern =regstr
if Reg.test(str) then 'Если найден соответствующий элемент
Установить Cols = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) 'Использовать первое найденное совпадение
else 'В противном случае укажите значение по умолчанию gb2312, что немного лениво. Если на странице не указан формат кодировки, это действительно немного хлопотно узнать.
serStr=gb2312
конец, если
GetCode=serStr
конечная функция
тусклый URL:url=request.querystring(url)
response.write GetResStr(URL)
%>
Код был организован. После экспериментов содержимое http://www.google.cn было успешно извлечено!!!!! Это решает проблему отсутствия разрешений.
На самом деле простой getpage.asp получить можно, но он не может динамически обрабатывать DOM, как js.
Существует еще одна проблема. Если вы используете первый метод для доступа к http://www.baidu.com, символы будут отображаться искаженно, поскольку кодировка Baidu — GB2312.
XMLHTTP возвращает формат кодировки UTF-8. При использовании второго метода такой проблемы не возникнет, пока сайт, определяющий формат кодировки, может нормально возвращать информацию (сюда не входят некоторые сайты, использующие специальную кодировку).