2

私はCodeIgniter のセッション ライブラリを使用しています。これは、サーバー側で非常に簡単にアクセスできます。クライアント側では、セッション Cookie は次のようになります (興味のある部分を太字で示しています)。

a:7:{s:10:"session_id";s:32:"47fe66476b098ff092f2fbdddfa53ffa";s:10:"ip_address";s:9:"127.0.0.1";s:10:"user_agent";s:50 :"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv";s:13:"last_activity";s:10:"1296180527";s:7:"user_id";s:3:" 895";s:8: "ユーザー名";s:8:"夏の N" ;s:6:"ステータス";s:1:"1";}fc0f1e75c097be7970b815a630bf33ef

へん。現在8文字の文字列Summer Nとして設定されている「username」にアクセスしたいのですが、これをjavascriptで解析する明白な方法はありますか? 正規表現を使用する必要がありますか?それとも、より単純なデータ形式で独自の「ユーザー」Cookie を作成し、CI のセッションに独自の処理を個別に実行させるより良い方法ですか?

4

3 に答える 3

5

私はあなたができるとは思わない。

必要なのは、Ajax を使用してそれを取得することです。

// javascript/jquery

$.post(<?php echo site_url('controller/get_session');?>, function(username) {
    // username is your session var
});

// PHP

function get_session() {
    echo $this->session->userdata('username');
}
于 2011-01-28T05:32:09.883 に答える
3

これは Cookie であるため、JS で Cookie の値を読み取るだけで、JavaScript で解析できる可能性がありますが、それは良い考えとは思えません。これは基本的にphpのシリアル化されたデータですが、正規表現はそれを処理できます。

まず、セッション cookie を暗号化するように CodeIgniter を設定する必要があります。これにより、cookie の解析を拒否することができ、より安全になります (良いことです)。

Thorpeが提案したように、コントローラを使用してajaxでユーザー名を取得できます。

または、ユーザー名が必要な場合は、応答の javascript 変数に設定してみませんか。

<script type='text/javascript'>
var ci_username = '<?php /* awsome php code that echos the username goes here */ ?>';
</script>

Cookie を解釈するよりも簡単で信頼性が高いようです。また、すぐに利用できるため、利用可能になる前に ajax 呼び出しが返されるのを待つ必要はありません。

ユーザーがログインしていない場合は、null などに設定します。

Extra : とにかくユーザー名が本当に必要ですか? サードパーティに渡さない限り、Webサーバーは常にユーザー名が何であるかを知っています..それはセッションの一部です..(または、あなたがやろうとしていることを見逃しているかもしれません)

于 2011-01-28T06:23:01.240 に答える
1

ajaxリクエストが最適であり、Cookieを暗号化する必要があるという以前のポスターに同意しますが、プロジェクトによってはそれが許可されない場合があります。私の場合、バックエンドへの追加のヒットを避けたかったのですが、Cookie に保存されているものは個人的なものではありませんでした。したがって、ここに私の2つの方法があります。どちらも新しく作成されたものであり、堅牢にテストされていないため、emptor に注意してください。

通常、CI セッション Cookie は、改ざんを防止するために MD5 チェックサムを含むシリアル化された配列のみであることに注意してください。私はチェックサムを破棄しますが、気にしないので、気にする場合はこのコードを微調整する必要があります。私のコードもオブジェクトやフロートを変換しません。それらも争いの中で失われます。

/**
 * Retrieves either a single cookie or the entire set of cookies. The array
 * is indexed by the cookie name.
 * @param cookie - name of the cookie you are interested in; can be null
 * @return - associative array of the cookies, or a string if you asked for a specific one
 * 
 **/
function cookieCutter(cookie){
    var rawcookie = unescape(document.cookie.replace(/\+/g, '%20'));
    var elems = rawcookie.split('=');
    var cookies = {};
    for(var i=0; i < elems.length; i++){
        cookies[elems[i]] = elems[i+1];
        i++;
    }
    if(null != cookie){
      return(cookies[cookie]);
    }
    return(cookies);
}


/**
 * Given a string that represents the contents of a server-side serialized PHP object, this
 * method will parse it out and return the appropriate object.
 * @param str - the serialized string
 * @return love and goodness of name=value pairs as an associative array for each item in the object
 *
 **/
function parseSerializedPHP(str){
    switch(str[0]){
        case 'a':
            var retArray = {};
            var matches = str.match(/a:(\d+):(\{.*\})/);
            var count = parseInt(matches[1]) * 2;
            var subElems = matches[2].match(/((s:\d+:"[^"]*";)|([b|i|f]:\d+))/g);
            for(var i=0; i < subElems.length; i++){
                key = parseSerializedPHP(subElems[i]);
                retArray[key] = parseSerializedPHP(subElems[i+1]);
                i++;
            }
            return(retArray);
            break;

        case 's':
            return(str.split('"')[1]);
            break;

        case 'i':
            return(parseInt(str.match(/\d+/)));
            break;

        case 'b':
            return( parseInt(str.match(/\d+/)) ? true : false );
            break;  
    }
    return(null);
}

典型的な使用法は次のようになります。

ciSessionItems = parseSerializedPHP(cookieCutter('my_sess_key'));

楽しみ!

于 2012-02-10T23:30:30.330 に答える