如何使用Javascript访问CodeIgniter会话cookie?

时间:2011-01-28 03:06:25

标签: javascript codeigniter session-cookies

我正在使用CodeIgniter's session library,这在服务器端非常容易访问。在客户端,会话cookie看起来像这样(我加粗了我感兴趣的部分):

一个:7:{S:10: “的session_id”; S:32: “47fe66476b098ff092f2fbdddfa53ffa”; S:10: “IP地址”; 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.有没有明显的方法在javascript中解析这个?我应该使用正则表达式吗?或者更好的方法是使用更简单的数据格式创建我自己的“用户”cookie,并让CI的会话分别做自己的事情?

3 个答案:

答案 0 :(得分: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');
}

答案 1 :(得分:2)

好吧它是一个cookie,所以你可以只读取JS中的cookie值,是的,你可以用javascript解析它,但这似乎不是一个好主意。它基本上是php serialized数据,但是reg exp可以处理它。

首先,你真的应该设置CodeIgniter来加密会话cookie,它会更安全,哪种拒绝你试图解析cookie(一件好事)

您可以使用控制器并使用像索普建议的ajax获取用户名。

或者,如果您需要用户名,为什么不在响应中将其设置为javascript变量:

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

似乎比解释cookie更直接,更可靠。并且它随时可用,所以你不需要等待ajax调用才能返回它。

如果您的用户未登录,请将其设置为null或类似的内容。

额外:你真的需要用户名吗?除非你把它传递给第三方,你的网络服务器总是知道用户名是什么..它是会话的一部分......(或者我可能错过了你想要做的事情)

答案 2 :(得分:1)

我同意之前的海报,即ajax请求是最佳的,并且cookie应该加密,但有时项目不允许这样做。在我的情况下,我想避免额外的后端命中,并且存储在cookie中的任何内容都是个人性质的。所以这是我的两种方法,两者都是新鲜的,因此它们没有经过强有力的测试。

注意,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'));

享受!