많은 사람들이 AJAX를 사용하여 다른 사람의 사이트에 있는 콘텐츠를 호출하면 JS는 보안상의 이유로 권한 없음 오류를 표시합니다. 이는 XMLHTTP 구성 요소의 제한 사항입니다.
동일한 도메인이 아닌 웹 사이트에 액세스하는 것은 금지되어 있습니다. http://www.google.cn에 액세스하는 예는 다음과 같습니다.
<스크립트 유형=텍스트/자바스크립트>
함수 createobj() {
if (window.ActiveXObject) {
새 ActiveXObject(Microsoft.XMLHTTP)를 반환합니다.
}
else if (window.XMLHttpRequest) {
새로운 XMLHttpRequest()를 반환합니다.
}
}
함수 getWebPage(url) {
var oBao=createobj();
var my_url=url
oBao.open('get',my_url,false);
oBao.onreadystatechange=함수(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}또 다른{
document.write(입력한 주소를 찾을 수 없거나 서버 505 오류입니다!);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
이 코드를 test.html에 저장하고 문제 없이 IE로 로컬로 열지만, 이 코드를 서버에 업로드한 후 문제가 발생합니다. JS에서 권한 없음 오류 메시지를 표시합니다!!! 이 문제를 해결하는 방법은 무엇입니까?
생각해 봅시다. 동일하지 않은 도메인 주소에는 액세스할 수 없으므로 동일한 도메인에 있는 주소에만 액세스할 수 있습니다. 동일한 도메인에 있는 동적 파일이 동일하지 않은 도메인에 있는 웹 페이지의 콘텐츠를 어떻게 얻을 수 있습니까? 우리는 여전히 AJAX를 생각하지만 이 AJAX는 서버 측에서 실행됩니다.
일반적인 아이디어는 다음과 같습니다. 먼저 getPage.asp와 같은 AJAX를 사용하여 자신의 사이트에 있는 파일에 URL을 제출합니다---getPage.asp에서 서버 XMLHTTP를 통해 제출된 URL에 다시 액세스합니다---얻은 콘텐츠를 제출된 URL 페이지----표시 내용
test.html 파일부터 시작하여 코드 정리를 시작해 보겠습니다.
<스크립트 유형=텍스트/자바스크립트>
함수 createobj() {
if (window.ActiveXObject) {
새 ActiveXObject(Microsoft.XMLHTTP)를 반환합니다.
}
else if (window.XMLHttpRequest) {
새로운 XMLHttpRequest()를 반환합니다.
}
}
함수 getWebPage(url) {
var oBao=createobj();
var my_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=함수(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}또 다른{
document.write(입력한 주소를 찾을 수 없거나 서버 505 오류입니다!);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
그런 다음 getpage.asp 파일이 있습니다(참고: 문자 왜곡을 방지하려면 이 파일을 UTF-8 형식으로 저장해야 함).
<%
response.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'함수 이름: GetResStr
'기능: 지정된 URL의 HTML 코드를 가져옵니다.
'매개변수: URL-얻을 URL
함수 GetResStr(URL)
오류가 발생했습니다.지우기
희미한 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
'기능: 바이너리 데이터를 문자로 변환
'파라미터: Body-binary 데이터, Cset-text 인코딩 방식
함수 BytesToBstr(Body,Cset)
희미한 객체 스트림
Objstream = CreateObject(adodb.stream) 설정
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write 본문
objstream.위치 = 0
objstream.Type = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Close
objstream = 아무것도 설정하지 않음
기능 종료
'함수 이름: GetCode
'기능: 바이너리를 문자로 변환
'매개변수: 쿼리할 문자열, regstr-정규식
함수 GetCode(str,regstr)
희미한 Reg,serStr
Reg= 새 RegExp 설정
Reg.IgnoreCase = 참
Reg.MultiLine = 참
등록 패턴 =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를 얻을 수는 있지만 js처럼 DOM을 동적으로 처리할 수는 없습니다.
또 다른 문제가 있습니다. 첫 번째 방법을 사용하여 http://www.baidu.com에 액세스하면 Baidu 인코딩이 GB2312이므로 문자가 깨져서 나타납니다.
XMLHTTP는 UTF-8 인코딩 형식을 반환합니다. 두 번째 방법을 사용하면 인코딩 형식을 정의하는 사이트에서 정상적으로 정보를 반환할 수 있는 한 이러한 문제가 발생하지 않습니다(특수 인코딩을 사용하는 일부 사이트는 포함되지 않음).