我正在使用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的会话分别做自己的事情?
答案 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'));
享受!