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。有没有一种明显的方法可以在 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序列化数据,但 reg exp 可以处理。

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

您可以使用控制器并使用 ajax 获取用户名,就像 Thorpe 建议的那样。

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

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

似乎比解释 cookie 更直接、更可靠。它随时可用,因此您无需等待 ajax 调用在可用之前返回。

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

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

于 2011-01-28T06:23:01.240 回答
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'));

享受!

于 2012-02-10T23:30:30.330 回答