2012年3月16日金曜日

[PHP][JavaScript] Ajaxからの通信(アクセス)かどうか判定する

ファイルへのアクセスがAjaxから要求されたものなのか、
それともブラウザからアドレスを直接叩くなどしてAjaxを通さずにアクセスしてきたのか調べたい時がある。

jQueryやprototypeなどのライブラリを使ってAjax通信をするときは実はヘッダに
「X-Requested-With:XMLHttpRequest」
というデータをつけて送ってくる。
なので、ヘッダ情報に「X-Requested-With」があるかどうかを調べて
それが「XMLHttpRequest」という値になってるかをチェックすればいい。

//link・・・http://mio-koduki.blogspot.com/2012/03/phpjavascript-ajax.html
//返り値・・・Ajaxからの通信であればtrue、そうでなければfalse
function is_ajax()
{
    return isset($_SERVER['HTTP_X_REQUESTED_WITH'])&&strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])=='xmlhttprequest';
}

という感じになる。

では、jQueryなどのライブラリを使わずに自力でXMLHttpRequest(IEであればActiveXObject」)を使ってAjaxを行なっている場合はどうすればいいか?
その時は自分でヘッダに「X-Requested-With:XMLHttpRequest」をつけてしまえばいい。

//link・・・http://mio-koduki.blogspot.com/2012/03/phpjavascript-ajax.html

//Ajax通信用のオブジェクト作成関数
function create_ajax_object()
{
    //IE以外
    if(window.XMLHttpRequest)
    {
        try
        {
            return new XMLHttpRequest();
        }
        catch(e)
        {
            return null;
        }
    }
    //IE
    else if(window.ActiveXObject)
    {
        try
        {
            //IE6以降
            return new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch(e)
        {
            try
            {
                //IE5
                return new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch(e)
            {
                return null;
            }
        }
    }
    else
    {
        return null;
    }
}

//Ajax通信関数
function ajax_access(method,path,data,callback,async_flag)
{
    //パスが設定されていなければnullを返す
    if(path==null)
    {
        return null;
    }

    //Ajax通信用のオブジェクト作成
    var ajax_object=create_ajax_object();

    //Ajax通信用のオブジェクト作成に失敗したらnullを返す
    if(ajax_object==null)
    {
        return null;
    }

    //メソッドに何も設定されていなければGETを設定する
    method=method||'GET';
    //同期フラグに何も設定されていなければtrueを設定する
    async_flag=async_flag||true;

    //通信回線を開く
    ajax_object.open(method,path,async_flag);

    //content-typeを指定する
    //これがないとPOSTのデータを飛ばすときなどに失敗することがある
    ajax_object.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');

    //「X-Requested-With:XMLHttpRequest」をヘッダにつける
    ajax_object.setRequestHeader('X-Requested-With','XMLHttpRequest');

    //通信時のイベント
    ajax_object.onreadystatechange=function()
    {
        //readyStateが4の時通信終了
        //statusが200の時通信成功
        if(ajax_object.readyState==4&&ajax_object.status==200)
        {
            //コールバック関数が設定されていれば呼び出す
            if(callback!=null)
            {
                //コールバック関数に結果を返す
                callback(ajax_object.responseText);
            }
        }
    }

    //データ送信
    ajax_object.send(data);
}

//Ajax通信を行う
ajax_access('post','test.php',encodeURIComponent('test')+'='+encodeURIComponent('テスト'),function(data){alert(data);},true);

とこんな感じになる。
久しぶりにJavaScriptでAjax書いた気がする。
ポイントはopenメソッドを呼び出した後に
setRequestHeaderを呼び出して「X-Requested-With:XMLHttpRequest」をヘッダにつけるところ

0 件のコメント:

コメントを投稿