多くの人が AJAX を使用して他の人のサイトのコンテンツを呼び出すと、JS によってアクセス許可なしのエラーが表示されます。これは、セキュリティ上の理由から、XMLHTTP コンポーネントの制限です。
同じドメイン以外の Web サイトへのアクセスは禁止されています。ここでは、http://www.google.cn にアクセスする例を示します。
<script type=text/javascript>
関数 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=function(){
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 のプロンプトが許可されていないというエラーが表示されます。これを解決するにはどうすればよいですか?
考えてみましょう。同じドメイン以外のアドレスにはアクセスできないので、同じドメイン内のアドレスにのみアクセスできるのですが、同じドメイン内の動的ファイルはどのようにして同じドメイン以外の Web ページのコンテンツを取得できるのでしょうか。私たちは今でも AJAX を思い浮かべますが、この AJAX はサーバー側で実行されます。
一般的な考え方は次のとおりです。まず、AJAX を使用して URL を自分のサイト内のファイル (getPage.asp など) に送信します --- getPage.asp では、サーバー XMLHTTP 経由で送信された URL に再度アクセスします --- 取得したコンテンツを送信された URL ページ ---- コンテンツの表示
test.html ファイルから始めてコードを整理しましょう
<script type=text/javascript>
関数 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=function(){
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 形式で保存する必要があります)。
<%
応答.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'関数名: GetResStr
'機能: 指定された URL の HTML コードを取得します
'パラメータ: URL - 取得する URL
関数 GetResStr(URL)
エラークリア
dim ResBody、ResStr、PageCode、ReturnStr
Http=createobject(MiCROSOFT.XMLHTTP) を設定します。
Http.open GET、URL、False
Http.Send()
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.Open
objstream.本体の書き込み
objstream.Position = 0
objstream.Type = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Close
objstream = 何も設定しない
終了機能
'関数名: GetCode
'機能: バイナリを文字に変換します
'パラメータ: str-クエリ対象の文字列、regstr-正規表現
関数 GetCode(str,regstr)
Dim Reg、serStr
set Reg= 新しい RegExp
Reg.IgnoreCase = True
Reg.MultiLine = True
登録パターン =regstr
if Reg.test(str) then '一致する項目が見つかった場合
Set Cols = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) '最初に見つかった一致を使用します
else 'それ以外の場合は、デフォルト値 gb2312 を指定します。これは少し面倒です。ページにエンコード形式が指定されていない場合、それを知るのは少し面倒です。
serStr=gb2312
終了する場合
GetCode=serStr
終了関数
dim url:url=request.querystring(url)
応答.write GetResStr(URL)
%>
実験後、コードの整理が完了しました。http://www.google.cn のコンテンツが正常に抽出されました。これにより、権限がない問題が解決されました。
実際、単純な getpage.asp は取得できますが、js のように DOM を動的に処理することはできません。
また、最初の方法で http://www.baidu.com にアクセスすると、baidu のエンコードが GB2312 であるため、文字化けが発生します。
XMLHTTP は UTF-8 エンコード形式を返します。 2 番目の方法では、エンコード形式を定義するサイトが正常に情報を返すことができる限り、このような問題は発生しません (一部の特殊なエンコードを使用するサイトは除きます)。