會話管理是web開發的一項重要內容,包括Session和Cookie兩種技術。本章介紹Cookie和Session的建立和使用。
Cookie:
cookie 常用於識別使用者。cookie 是伺服器留在使用者電腦中的小檔案。每當相同的電腦通過瀏覽器請求頁面時,它同時會發送 cookie。通過 PHP能夠建立並取回 cookie 的值。cookie 只能讀取所在域,單一域不能超過20個cookie,每個cookie檔案長度上限位4k位元組,瀏覽器最多儲存300個cookie。
cookie的建立:
setcookie() 函數用於設定 cookie。注意:setcookie() 函數必須位於標籤之前。
文法:
/**
* name:必需。規定 cookie 的名稱。
* value:必需。規定 cookie 的值。
* expire:可選。規定 cookie 的有效期間。
* path:可選。規定 cookie 的伺服器路徑。
* domain:可選。規定 cookie 的網域名稱。
* secure:可選。規定是否通過安全的 HTTPS 串連來傳輸 cookie。
*/
setcookie(name,value,expire,path,domain,secure)
注釋:在發送cookie時,cookie的值會自動進行URL編碼。接收時會進行URL解碼。
例子:
1.設定並發送 cookie:
<?php
$value = "my cookie value";
// 發送一個簡單的 cookie
//cookie24小時到期
setcookie("TestCookie", $value, time()+3600*24);
?>
...
...
2.檢索出 cookie 值的不同方法:
<?php
// 輸出個別的 cookie
echo $_COOKIE["TestCookie"];
echo "
";
echo $HTTP_COOKIE_VARS["TestCookie"];
echo "
";
// 輸出所有 cookie
print_r($_COOKIE);
?>
3.輸出
my cookie value
my cookie value
Array ([TestCookie] => my cookie value)
4.刪除 cookie
通過把失效日期設定為過去的日期/時間,刪除一個 cookie:
<?php
// set the expiration date to one hour ago
setcookie("TestCookie", "", time()-3600);
?>
Session:
PHP session 變數用於儲存有關使用者會話的資訊,或更改使用者會話的設定。Session 變數儲存的資訊是單一使用者的,並且可供應用程式中的所有頁面使用。Session 的工作機制是:為每個訪問者建立一個唯一的 id (UID),並基於這個 UID 來儲存變數。UID 儲存在 cookie 中,亦或通過 URL 進行傳導。
session的建立:
在您把使用者資訊儲存到 PHP session 中之前,首先必須啟動會話。session_start() 函數必須位於標籤之前。
文法:
session_start();
例子:
1.開始session
<?php session_start(); ?>
2.儲存 session 變數
儲存和取回 session 變數的正確方法是使用 $_SESSION 變數:
<?php
session_start();
// store session data
$_SESSION['views']=1;
?>
<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>
3.輸出
Pageviews=1
4.終結 session
如果您希望刪除某些 session 資料,可以使用 unset() 或 session_destroy() 函數。
unset() 函數用於釋放指定的 session 變數:
<?php
unset($_SESSION['views']);
?>
您也可以通過 session_destroy() 函數徹底終結 session:
<?php
session_destroy();
?>
通過session設定使用者登入後的顯示資訊
在網站的頂部通常會有使用者登入和註冊的入口,還有在使用者登入之後,要顯示出使用者的資訊,如帳號,還有將登入入口變為退出;
在使用symphony模板中,可以使用如下代碼:
<span>您好</span><span style="color:#009cff;">{{ app.session.get('member_name') }}</span><span>,歡迎來到**網!</span>
{% if app.session.get('member_name') == null %}
<li><a href="{{ path('zm_member_login') }}">登入</a></li>
<li><a href="{{ path('zm_member_register') }}">註冊</a></li>
{% elseif app.session.get('member_name') != "" %}
<li><a href="{{ path('zm_member_logout') }}">退出</a></li>
{% endif %}
一開始使用{% if app.session.get(‘member_name’) ==“”%}
後來總報錯,之後將改成null,即可以判斷成功是否有使用者的登入session。
PHP中SESSION與COOKIE的區別
這兩者,區別和聯絡其實也挺深奧的,總是瞭解一些皮毛,每次都得上網查,今天寫下來,每隔段時間就看看,加深記憶。
Session是由應用伺服器維持的一個伺服器端的儲存空間,使用者在串連伺服器時,會由伺服器產生一個唯一的SessionID,用該SessionID 為標識符來存取伺服器端的Session儲存空間。而SessionID這一資料則是儲存到用戶端,用Cookie儲存的,使用者提交頁面時,會將這一 SessionID提交到伺服器端,來存取Session資料。這一過程,是不用開發人員幹預的。所以一旦用戶端禁用Cookie,那麼Session也會失效。
伺服器也可以通過URL重寫的方式來傳遞SessionID的值,因此不是完全依賴Cookie。如果用戶端Cookie禁用,則伺服器可以自動通過重寫URL的方式來儲存Session的值,並且這個過程對程式員透明。
可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進位的字串,是SessionID的值。
大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都開啟新的會話,而且伺服器也不會自動維護客戶的上下文資訊,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種儲存上下文資訊的機制,它是針對每一個使用者的,變數的值儲存在伺服器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,預設使用cookie來實現,系統會創造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是儲存於瀏覽器記憶體中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到sessionid=KWJHUG6JJM65HS2K6之類的字串。
明白了原理,我們就可以很容易的分辨出persistent cookies和session cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie只是存在於用戶端硬碟上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站指令碼攻擊,自然不如session cookie安全了。
通常session cookie是不能跨視窗使用的,當你新開了一個瀏覽器視窗進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們資訊共用的目的就達不到了,此時我們可以先把sessionid儲存在persistent cookie中,然後在新視窗中讀出來,就可以得到上一個視窗SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨視窗的session tracking(會話跟蹤)。
在一些web開發的書中,往往只是簡單的把Session和cookie作為兩種並列的http傳送資訊的方式,session cookies位於伺服器端,persistent cookie位於用戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯絡和區別,我們就不難選擇合適的技術來開發web service了。