เมื่อมีคนจำนวนมากใช้ AJAX เพื่อเรียกเนื้อหาบนไซต์ของผู้อื่น JS จะแจ้งข้อผิดพลาดเกี่ยวกับการไม่อนุญาต นี่เป็นข้อจำกัดของคอมโพเนนต์ XMLHTTP ด้วยเหตุผลด้านความปลอดภัย
ห้ามมิให้เข้าถึงเว็บไซต์ที่ไม่ได้อยู่ในโดเมนเดียวกัน นี่คือตัวอย่างในการเข้าถึง http://www.google.cn
<ประเภทสคริปต์=ข้อความ/จาวาสคริปต์>
ฟังก์ชั่น createobj() {
ถ้า (window.ActiveXObject) {
ส่งคืน ActiveXObject ใหม่ (Microsoft.XMLHTTP);
-
อื่นถ้า (window.XMLHttpRequest) {
กลับ XMLHttpRequest ใหม่ ();
-
-
ฟังก์ชั่น getWebPage(url) {
var oBao=createobj();
var my_url=url
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
ถ้า(oBao.readyState==4){
ถ้า(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}อื่น{
document.write(ไม่พบที่อยู่ที่คุณป้อนหรือข้อผิดพลาดเซิร์ฟเวอร์ 505!);
-
-
-
oBao.ส่ง(null);
-
getWebPage('http://www.google.cn');
</สคริปต์>
บันทึกรหัสนี้ไปที่ test.html และเปิดในเครื่องด้วย IE โดยไม่มีปัญหาใด ๆ แต่หลังจากอัปโหลดรหัสนี้ไปยังเซิร์ฟเวอร์ เกิดปัญหาขึ้น - JS แจ้งว่าไม่มีข้อผิดพลาดในการอนุญาต!!!
ลองคิดดู: เนื่องจากคุณไม่สามารถเข้าถึงที่อยู่โดเมนที่ไม่เหมือนกัน คุณจึงสามารถเข้าถึงเฉพาะที่อยู่ในโดเมนเดียวกันเท่านั้น ไฟล์ไดนามิกในโดเมนเดียวกันสามารถรับเนื้อหาของหน้าเว็บในโดเมนที่ไม่เดียวกันได้อย่างไร เรายังคงนึกถึง AJAX แต่ AJAX นี้ดำเนินการบนฝั่งเซิร์ฟเวอร์
แนวคิดทั่วไปก็คือ ขั้นแรกให้ส่ง URL ไปยังไฟล์ในเว็บไซต์ของคุณเองโดยใช้ AJAX เช่น getPage.asp---ใน getPage.asp ให้เข้าถึง URL ที่ส่งอีกครั้งผ่านเซิร์ฟเวอร์ XMLHTTP---ส่งคืนเนื้อหาที่ได้รับไปที่ หน้า URL ที่ส่ง ---- แสดงเนื้อหา
มาเริ่มจัดระเบียบโค้ดกัน โดยเริ่มจากไฟล์ test.html
<ประเภทสคริปต์=ข้อความ/จาวาสคริปต์>
ฟังก์ชั่น createobj() {
ถ้า (window.ActiveXObject) {
ส่งคืน ActiveXObject ใหม่ (Microsoft.XMLHTTP);
-
อื่นถ้า (window.XMLHttpRequest) {
กลับ XMLHttpRequest ใหม่ ();
-
-
ฟังก์ชั่น getWebPage(url) {
var oBao=createobj();
var my_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
ถ้า(oBao.readyState==4){
ถ้า(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}อื่น{
document.write(ไม่พบที่อยู่ที่คุณป้อนหรือข้อผิดพลาดเซิร์ฟเวอร์ 505!);
-
-
-
oBao.ส่ง(null);
-
getWebPage('http://www.google.cn');
</สคริปต์>
จากนั้นจะมีไฟล์ getpage.asp (หมายเหตุ: ไฟล์นี้จะต้องบันทึกในรูปแบบ UTF-8 เพื่อป้องกันอักขระที่อ่านไม่ออก) ดังนี้:
-
response.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'ชื่อฟังก์ชัน: GetResStr
'ฟังก์ชัน: รับโค้ด HTML ของ URL ที่ระบุ'
'พารามิเตอร์: URL-URL ที่จะได้รับ
ฟังก์ชั่น GetResStr (URL)
ผิดพลาดชัดเจน
ResBody สลัว, ResStr, PageCode, ReturnStr
ตั้งค่า Http=createobject(MiCROSOFT.XMLHTTP)
Http.open GET, URL, เท็จ
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
'ฟังก์ชัน: แปลงข้อมูลไบนารีเป็นอักขระ'
'พารามิเตอร์: ข้อมูล Body-binary, วิธีการเข้ารหัสข้อความ Cset
ฟังก์ชั่น BytesToBstr (เนื้อความ, Cset)
ดิม ออบสตรีม
ตั้งค่า Objstream = CreateObject (adodb.stream)
objstream.Type = 1
objstream.Mode =3
objstream.เปิด
objstream เขียนเนื้อหา
objstream ตำแหน่ง = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.ปิด
ตั้งค่า objstream = ไม่มีเลย
ฟังก์ชันสิ้นสุด
'ชื่อฟังก์ชัน: GetCode
'ฟังก์ชัน: แปลงไบนารีเป็นอักขระ'
'พารามิเตอร์: สตริง str ที่จะสอบถาม, นิพจน์ regstr-regular
ฟังก์ชัน GetCode(str,regstr)
Dim Reg, เซอร์Str
ตั้ง Reg= RegExp ใหม่
Reg.IgnoreCase = จริง
Reg.MultiLine = จริง
Reg.Pattern =regstr
ถ้า Reg.test(str) ดังนั้น 'หากพบรายการที่ตรงกัน'
ตั้งค่า Cols = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) 'ใช้รายการที่ตรงกันแรกที่พบ
อย่างอื่น 'มิฉะนั้น ให้ระบุค่าเริ่มต้น gb2312 ซึ่งค่อนข้างจะขี้เกียจเล็กน้อย หากหน้าเว็บไม่มีรูปแบบการเข้ารหัส อาจเป็นเรื่องยากที่จะทราบ
serStr=gb2312
สิ้นสุดถ้า
GetCode=serStr
ฟังก์ชั่นสิ้นสุด
URL สลัว:url=request.querystring(url)
ตอบกลับเขียน GetResStr (URL)
-
โค้ดได้รับการจัดระเบียบแล้ว หลังจากทดลอง เนื้อหาของ http://www.google.cn ก็ถูกแยกออกสำเร็จ !!!!! วิธีนี้ช่วยแก้ปัญหาเรื่องการไม่มีสิทธิ์ได้
ในความเป็นจริง getpage.asp แบบธรรมดาสามารถรับได้ แต่ไม่สามารถประมวลผล DOM แบบไดนามิกเช่น js ได้
มีปัญหาอื่นอีกประการหนึ่ง หากคุณใช้วิธีแรกในการเข้าถึง http://www.baidu.com อักขระที่อ่านไม่ออกจะปรากฏขึ้นเนื่องจากการเข้ารหัส baidu คือ GB2312
XMLHTTP ส่งคืนรูปแบบการเข้ารหัส UTF-8 หากใช้วิธีที่สอง ปัญหาดังกล่าวจะไม่เกิดขึ้น ตราบใดที่ไซต์ที่กำหนดรูปแบบการเข้ารหัสสามารถส่งคืนข้อมูลได้ตามปกติ (ไม่รวมบางไซต์ที่ใช้การเข้ารหัสพิเศษ)