ホームページ  >  記事  >  バックエンド開発  >  AJAX クロスドメイン アクセス - 2 つの効果的なソリューションの紹介_PHP チュートリアル

AJAX クロスドメイン アクセス - 2 つの効果的なソリューションの紹介_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:04:29958ブラウズ

新しい W3C ポリシーは HTTP クロスドメイン アクセスを実装しており、私はこの問題を解決するための情報を長い間探してきました。
サーブレットによって返されるヘッダー情報に Access-Control-Allow-Origin を追加するだけです。
たとえば、ローカルのクロスドメイン アクセスをすべてオープンしたい場合は、次のように設定します: response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1/*") );
このようにして、ローカル プロジェクト A の AJAX リクエストは、プロジェクト B のサーブレットをクロスドメインでリクエストできます。
コードは次のとおりです:
HTML JS ajax リクエスト:

コードをコピーします コードは次のとおりです:

/* Web サーバーと通信するための新しい XMLHttpRequest オブジェクトを作成します */
var xmlHttp = false ;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlHttp = new ActiveXObject("Msxml2. = new ActiveXObject("Microsoft. = new XMLHttpRequest( );
}
var url = "http://127.0.0.1:2012/esb/servlet/HttpClient?randomType=MIX";
xmlHttp.open("GET", url, true);
/ /関数を設定する完了時にサーバーが実行されるようにします
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState == 4) {
var response = xmlHttp.responseText;
alert(response);
}
}
//Send request
xmlHttp.send(null);




サーブレットコード:





コードをコピー

コードは次のとおりです:
protected void service(HttpServletRequest req, Http ServletResponse)
投げるServletException, java.io.IOException {
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");//次の文はcore resp.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1/*");resp.setDateHeader("Expires", 0);ServletOutputStream sos = resp.getOutputStream() ;
try {
sos.write(obj.toString().getBytes("GBK"));
} catch (Exception e) {
System.out.println(e.toString90)
} 最後に {
try {
sos .close();
} catch (Exception e) {
LOG.error(e);
}
}
}


2日後、サーブレットをサーバーに配置してローカルでテストできます。起動してローカルでテストします。
上記の方法で問題は完全に解決されますが、上記の記事にも記載されています。セキュリティの問題がある可能性があり、すべての新しい標準がサポートされているかどうかはまだ疑問です。そのため、サーバーのサーブレットが JS スクリプトを返す場合、js にはクロスドメインの問題がないため、別の難しい方法を使用して同じ効果を達成できます。それでおしまい。プロジェクト A の js 内の javascript の src を使用してプロジェクト B のサーブレットにアクセスし、サーブレットによって出力された js スクリプトを通じてデータを渡すことができます。そこで、この考えに基づいて、次のコードの別のテストを作成しました:

ページの JS コード:




コードをコピーします

コードは次のとおりです:

function loadAjax(){
id= "testesbscript";
oScript = document.getElementById(id);
var head = document.getElementsByTagName("head").item(0); if (oScript) { head.removeChild(oScript); } oScript = document.createElement("script ");
var url = "http://127.0.0.1:2012/esb/servlet/HttpClient?randomType=MIX&success=justHandle
oScript.setAttribute("id",id);
oScript .setAttribute("type", "text/javascript");
oScript.setAttribute(" language","javascript");
head.appendChild(oScript);
}
// jsutHandle 関数は、次の逆関数です。サーブレット コードの eval を実行します。
function justHandle(dd){
alert(dd);
}



コードをコピーします

コードは次のとおりです:

protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {

Object obj = "test";
ServletOutputStream sos = resp.getOutputStream();
StringBuffer sb = new StringBuffer();
resp.setCharacterEncoding("GBK");

resp.setHeader("Charset","GBK");
resp.setContentType("charset=GBK");
//下面那句指摘是javascript脚本文件
resp .setContentType("テキスト/javascript");

sb.append("eval(/""+paramMap.get("success")+"(/'"+obj.toString()+"/')/")");
try {
sos. write(sb.toString().getBytes(this.character_encoding));
} catch (Exception e) {
System.out.println(e.toString());
}finally {
try {
sos.close( );
} catch (例外 e) {
System.out.println(e.toString());
}
}
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327758.html技術記事新しい W3C 戦略略实现了 HTTP 全域ドメイン藮、还亏我找了很久の资料解决この问問題: サーブレットに返される管理部情報に Access-Control-Allow-Origin を追加するだけで、これは可能です...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。