2011-01-28 31 views
2

我正在使用CodeIgniter's session library,這在服務器端非常容易訪問。在客戶端,會話cookie看起來像這樣(我粗體顯示了我感興趣的部分):如何使用JavaScript訪問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:「username」; s:8:「Summer N」; s :6:「status」; s:1:「1」;} fc0f1e75c097be7970b815a630bf33ef

我想訪問「用戶名」,它目前設置爲8個字符的字符串夏季N.是否有一種明顯的方式解析這在JavaScript?我應該只是使用正則表達式?或者是更好的方式將創建一個簡單的數據格式我自己的「用戶」cookie,只是letti CI的會議分開做自己的事情嗎?

回答

2

那麼它是一個cookie,所以你可以只讀取JS cookie的值,是的,你可能用JavaScript但分析它似乎不是一個好主意。它基本上是php serialized數據,但是一個reg exp可以處理這個數據。

第一件事情,你真的應該設置笨加密的會話cookie,它會安全很多,哪種否認你試圖解析該cookie(一件好事)

你可以使用一個控制器並用Thorpe建議的ajax獲取用戶名。

或者,如果您需要的用戶名,爲什麼你不把它在你的迴應javascript變量:

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

似乎更直接,比解釋餅乾更可靠。它可以隨時使用,因此您無需等待ajax呼叫在可用之前返回。

如果你的用戶沒有登錄,將其設置爲null或類似的東西。

額外:你真的需要用戶名嗎?除非你將它傳遞給第三方,否則你的網絡服務器總是知道用戶名是什麼..它是會話的一部分..(或者我錯過了你想要做的事情)

+0

謝謝。你說得對,我應該加密cookie。我想要用戶名的原因是我希望我的大部分網站都緩存在頁面級別,但是在頁面頂部,有一些特定於用戶的鏈接可以讓javascript添加基於曲奇餅。只是想說「嗨,本」 - 我不會依賴任何服務器端的cookie。 – Summer 2011-01-28 22:55:15

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'); 
} 
+0

好主意 - 但做客戶端的想法是儘量減少額外的服務器點擊... – Summer 2011-01-28 22:56:18

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'));

享受!