Ketika banyak orang menggunakan AJAX untuk memanggil konten di situs orang lain, JS akan memunculkan kesalahan tanpa izin. Ini adalah batasan komponen XMLHTTP - untuk alasan keamanan
Dilarang mengakses website yang bukan domainnya sama. Berikut contoh mengakses http://www.google.cn,
<tipe skrip=teks/javascript>
fungsi buatobj() {
if (jendela.ActiveXObject) {
kembalikan ActiveXObject baru (Microsoft.XMLHTTP);
}
else if (jendela.XMLHttpRequest) {
kembalikan XMLHttpRequest();
}
}
fungsi getWebPage(url) {
var oBao=buatobj();
var my_url=url
oBao.open('dapatkan',url_saya,false);
oBao.onreadystatechange=fungsi(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
dokumen.write(returnStr);
}kalau tidak{
document.write(Alamat yang Anda masukkan tidak ditemukan atau server 505 error!);
}
}
}
oBao.kirim(null);
}
getWebPage('http://www.google.cn');
</skrip>
Simpan kode ini ke test.html dan buka secara lokal dengan IE tanpa masalah, tetapi setelah mengunggah kode ini ke server, terjadi masalah - JS tidak meminta kesalahan izin!!! Bagaimana cara mengatasinya?
Mari kita pikirkan: Karena Anda tidak dapat mengakses alamat domain yang tidak sama, Anda hanya dapat mengakses alamat di domain yang sama. Bagaimana file dinamis di domain yang sama dapat memperoleh konten halaman web di domain yang tidak sama? Kami masih memikirkan AJAX, tapi AJAX ini dijalankan di sisi server.
Ide umumnya adalah ini: pertama kirimkan URL ke file di situs Anda sendiri menggunakan AJAX, seperti getPage.asp---di getPage.asp, akses kembali URL yang dikirimkan melalui server XMLHTTP---kembalikan konten yang diperoleh ke Halaman URL yang dikirimkan----menampilkan konten
Mari kita mulai mengatur kodenya, dimulai dengan file test.html
<tipe skrip=teks/javascript>
fungsi buatobj() {
if (jendela.ActiveXObject) {
kembalikan ActiveXObject baru (Microsoft.XMLHTTP);
}
else if (jendela.XMLHttpRequest) {
kembalikan XMLHttpRequest();
}
}
fungsi getWebPage(url) {
var oBao=buatobj();
var my_url=getpage.asp?url=+escape(url);
oBao.open('dapatkan',url_saya,false);
oBao.onreadystatechange=fungsi(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
dokumen.write(returnStr);
}kalau tidak{
document.write(Alamat yang Anda masukkan tidak ditemukan atau server 505 error!);
}
}
}
oBao.kirim(null);
}
getWebPage('http://www.google.cn');
</skrip>
Lalu ada file getpage.asp (catatan: file ini harus disimpan dalam format UTF-8 untuk mencegah karakter kacau), sebagai berikut:
<%
respon.charset=UTF-8
reg=/<meta.+ rangkaian karakter= {0,}([^/ />//]*).+//{0,1}/>
'Nama fungsi: GetResStr
'Fungsi: Mendapatkan kode HTML dari URL yang ditentukan
'Parameter: URL - URL yang akan diperoleh
fungsi GetResStr(URL)
err.jelas
redupkan ResBody,ResStr,PageCode,ReturnStr
Setel Http=buat objek(MiCROSOFT.XMLHTTP)
Http.buka GET,URL,Salah
Http.Kirim()
Jika Http.Readystate =4 Lalu
Jika Http.status=200 Lalu
ResStr=http.responseText
ResBody=http.responseBody
Kode Halaman=GetCode(ResStr,reg)
ReturnStr=BytesToBstr(http.responseBody,Kode Halaman)
GetResStr=KembaliStr
Akhiri Jika
Akhiri Jika
Fungsi Akhir
'Nama fungsi:BytesToBstr
'Fungsi: Mengubah data biner menjadi karakter
'Parameter: Data biner tubuh, metode pengkodean teks-Cset
Fungsi BytesToBstr(Badan,Cset)
Redupkan Objstream
Setel Objstream = CreateObject(adodb.stream)
objstream.Jenis = 1
objstream.Mode =3
objstream.Buka
objstream.Tulis isi
objstream.Posisi = 0
objstream.Jenis = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Tutup
setel objstream = tidak ada
Fungsi Akhir
'Nama fungsi: GetCode
'Fungsi: Mengubah biner menjadi karakter
'Parameter: str-string yang akan ditanyakan, ekspresi reguler regstr
Fungsi GetCode(str,regstr)
Redupkan Reg,serStr
atur Reg= RegExp baru
Reg.IgnoreCase = Benar
Reg.MultiLine = Benar
Reg.Pola =regstr
if Reg.test(str) lalu 'Jika item yang cocok ditemukan
Setel Cols = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) 'Gunakan kecocokan pertama yang ditemukan
else 'Jika tidak, berikan nilai default gb2312, yang agak malas. Jika halaman tidak memberikan format pengkodean, memang agak merepotkan untuk mengetahuinya.
serStr=gb2312
berakhir jika
GetCode=serStr
fungsi akhir
redupkan url:url=request.querystring(url)
respon.tulis GetResStr(URL)
%>
Organisasi kode selesai. Setelah percobaan, konten http://www.google.cn berhasil diekstraksi!!!!!!
Faktanya, getpage.asp sederhana dapat diperoleh, tetapi tidak dapat memproses DOM secara dinamis seperti js.
Ada masalah lain. Jika Anda menggunakan metode pertama untuk mengakses http://www.baidu.com, karakter kacau akan muncul karena pengkodean baidu adalah GB2312.
XMLHTTP mengembalikan format pengkodean UTF-8. Dengan menggunakan metode kedua, masalah seperti itu tidak akan terjadi selama situs yang menentukan format pengkodean dapat mengembalikan informasi secara normal (ini tidak termasuk beberapa situs yang menggunakan pengkodean khusus).