日本xxxx18视频在线观看-日本xxxx1819-日本xxxwww在线观看-日本xxx-日本xx-日本www在线视频

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

學(xué)PHP5:session會話的使用和分析

admin
2012年4月4日 0:23 本文熱度 2804
Session的中文譯名叫做“會話”,其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個session。目前社會上對session的理解非常混亂:有時候我們可以看到這樣的話“在一個瀏覽器會話期間,...”,這里的會話是指從一個瀏覽器窗口打開到關(guān)閉這個期間; 也可以看到“用戶(客戶端)在一次會話期間”這樣一句話,它可能指用戶的一系列動作(一般情況下是同某個具體目的相關(guān)的一系列動作,比如從登錄到選購商品到結(jié)賬登出這樣一個網(wǎng)上購物的過程;然而有時候也可能僅僅是指一次連接;其中的差別只能靠上下文來推斷了。

然而當(dāng)session一詞與網(wǎng)絡(luò)協(xié)議相關(guān)聯(lián)時,它又往往隱含了“面向連接”和/或“保持狀態(tài)”這樣兩個含義,“面向連接”指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始。“保持狀態(tài)”則是指通信的一方能夠把一系列的消息關(guān)聯(lián)起來,使得消息之間可以互相依賴,比如一個服務(wù)員能夠認(rèn)出再次光臨的老顧客并且記得上次這個顧客還欠店里一塊錢。這一類的例子有“一個TCP session”或者“一個POP3 session”。

鑒于這種混亂已不可改變,要為session下個定義就很難有統(tǒng)一的標(biāo)準(zhǔn)。而在閱讀session相關(guān)資料時,我們也只有靠上下文來推斷理解了。不過我們可以這樣理解:例如我們打電話,從撥通的那一刻起到掛斷電話期間,因為電話一直保持著接通的狀態(tài),所以把這種接通的狀態(tài)叫做session。它是訪客與整個網(wǎng)站交互過程中一直存在的公有變量,在客戶端不支持COOKIE的時候,為了保證數(shù)據(jù)正確、安全,就采用SESSION變量。訪問網(wǎng)站的來客會被分配一個唯一的標(biāo)識符,即所謂的會話 ID。它要么存放在客戶端的 cookie,要么經(jīng)由 URL 傳遞。

SESSION的發(fā)明填補(bǔ)了HTTP協(xié)議的局限:HTTP協(xié)議被認(rèn)為是無狀態(tài)協(xié)議,無法得知用戶的瀏覽狀態(tài),當(dāng)它在服務(wù)端完成響應(yīng)之后,服務(wù)器就失去了與該瀏覽器的聯(lián)系。這與HTTP協(xié)議本來的目的是相符的,客戶端只需要簡單的向服務(wù)器請求下載某些文件,無論是客戶端還是服務(wù)器都沒有必要紀(jì)錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機(jī)或者一個普通的(非會員制)大賣場之間的關(guān)系一樣。
因此通過SESSION(cookie是另外一種解決辦法)記錄用戶的有關(guān)信息,以供用戶再次以此身份對web服務(wù)器提起請求時作確認(rèn)。會話的發(fā)明使得一個用戶在多個頁面間切換時能夠保存他的信息。網(wǎng)站編程人員都有這樣的體會,每一頁中的變量是不能在下一頁中使用的(雖然form,url也可以實現(xiàn),但這都是非常不理想的辦法),而SESSION中注冊的變量就可以作為全局變量使用了。

那么SESSION到底有什么用處呢?網(wǎng)上購物時大家都用過購物車,你可以隨時把你選購的商品加入到購物車中,最后再去收銀臺結(jié)帳。在整個過程中購物車一直扮演著臨時存貯被選商品的角色,用它追蹤用戶在網(wǎng)站上的活動情況,這就是SESSION的作用,它可以用于用戶身份認(rèn)證,程序狀態(tài)記錄,頁面之間參數(shù)傳遞等。

SESSION的實現(xiàn)中采用COOKIE技術(shù),SESSION會在客戶端保存一個包含session_id(SESSION編號)的COOKIE;在服務(wù)器端保存其他session變量,比如session_name等等。當(dāng)用戶請求服務(wù)器時也把session_id一起發(fā)送到服務(wù)器,通過session_id提取所保存在服務(wù)器端的變量,就能識別用戶是誰了。同時也不難理解為什么SESSION有時會失效了。

當(dāng)客戶端禁用COOKIE時(點擊IE中的“工具”—“Internet選項”,在彈出的對話框里點擊“安全”—“自定義級別”項,將“允許每個對話COOKIE”設(shè)為禁用),session_id將無法傳遞,此時SESSION失效。不過php5在linux/unix平臺可以自動檢查cookie狀態(tài),如果客戶端設(shè)置了禁用,則系統(tǒng)自動把session_id附加到url上傳遞。windows主機(jī)則無此功能。

Session常見函數(shù)及用法?

Session_start() :開始一個會話或者返回已經(jīng)存在的會話。

說明:這個函數(shù)沒有參數(shù),且返回值均為true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前瀏覽器不能有任何輸出,否則會發(fā)生以下錯誤:
Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………
你可以在php.ini里啟動session.auto_start=1,這樣就無需每次使用session之前都要調(diào)用session_start()。但啟用該選項也有一些限制,如果確實啟用了 session.auto_start,則不能將對象放入會話中,因為類定義必須在啟動會話之前加載以在會話中重建對象。
請求結(jié)束后所有注冊的變量都會被序列化。已注冊但未定義的變量被標(biāo)記為未定義。在之后的訪問中這些變量也未被會話模塊定義,除非用戶以后定義它們。

警告: 有些類型的數(shù)據(jù)不能被序列化因此也就不能保存在會話中。包括 resource 變量或者有循環(huán)引用的對象(即某對象將一個指向自己的引用傳遞給另一個對象)。

注冊SESSION變量 :

PHP5使用$_SESSION[‘xxx’]=xxx注冊SESSION全局變量。和GET,POST,COOKIE的使用方法相似。

注意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle設(shè)為on,不過出于安全考慮,強(qiáng)烈建議關(guān)閉register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建議用$_SESSION代替之。例如:

Page1.php
<?php
Session_start(); //使用SESSION前必須調(diào)用該函數(shù)。
$_SESSION[‘name’]=”我是黑旋風(fēng)李逵!”; //注冊一個SESSION變量
$_SESSION[‘passwd’]=”mynameislikui”;
$_SESSION[‘time’]=time();
echo '<br /><a href="page2.php">通過COOKIE傳遞SESSION</a>'; //如果客戶端支持cookie,可通過該鏈接傳遞session到下一頁。
echo '<br /><a href="page2.php?' . SID . '">通過URL傳遞SESSION</a>';//客戶端不支持cookie時,使用該辦法傳遞session.
?>
Page2.php
<?php
session_start();
echo $_SESSION['name']; //
echo $_SESSION['passwd']; //
echo date('Y m d H:i:s', $_SESSION['time']);
echo '<br /><a href="page1.php">返回山一頁</a>';
?>

有兩種方法傳遞一個會話 ID:

cookie

URL 參數(shù)

會話模塊支持這兩種方法。cookie 更優(yōu)化,但由于不總是可用,也提供替代的方法。第二種方法直接將會話 ID 嵌入到 URL 中間去。

PHP 可以透明地轉(zhuǎn)換連接。除非是使用 PHP 4.2 或更新版本,需要手工在編譯 PHP 時激活。在 Unix 下,用 --enable-trans-sid 配置選項。如果此配置選項和運行時選項 session.use_trans_sid 都被激活(修改php.ini),相對 URI 將被自動修改為包含會話 ID。

● session_id

session_id() 用于設(shè)定或取得當(dāng)前session_id。php5中既可以使用session_id(),也可以通過附加在url上的SID取得當(dāng)前會話的session_id和session_name。

如果session_id()有具體指定值的話,將取代當(dāng)前的session_id值。使用該函數(shù)前必須啟動會話:session_start();

當(dāng)我們使用session cookies時,如果指定了一個session_id()值,每次啟動session_start()都會往客戶端發(fā)送一個cookie值。不論當(dāng)前session_id是否與指定值相等。
session_id()如果沒有指定值,則返回當(dāng)前session_id();當(dāng)前會話沒有啟動的話,則返回空字符串。

● 檢查session是否存在?

在以往的php版本中通常使用session_is_register()檢查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX來注冊會話變量,則session_is_register()函數(shù)不再起作用。你可以使用
isset($_SESSION[‘xxx’])來替代。

● 更改session_id session_regenerate_id() 更改成功則返回true,失敗則返回false。
使用該函數(shù)可以為當(dāng)前session更改session_id,但不改變當(dāng)前session的其他信息。例如:

<?php
session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();
echo "原始 SessionID: $old_sessionid<br />";
echo "新的 SessionID: $new_sessionid<br />";
echo"<pre>";
print_r($_SESSION);
echo"</pre>";
?>

● session_name() 返回當(dāng)前session的name或改變當(dāng)前session的name。如果要改變當(dāng)前session的name,必須在session_start()之前調(diào)用該函數(shù)。注意:session_name不能只由數(shù)字組成,它至少包含一個字母。否則會在每時每刻都生成一個新的session id.

session改名示例:

<?php
$previous_name = session_name("WebsiteID");
echo "新的session名為: $previous_name<br />";
?>

● 如何刪除session?

1、unset ($_SESSION['xxx']) 刪除單個session,unset($_SESSION['xxx']) 用來unregister一個已注冊的session變量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用,可將之打入冷宮。

unset($_SESSION) 此函數(shù)千萬不可使用,它會將全局變量$_SESSION銷毀,而且還沒有可行的辦法將其恢復(fù)。用戶也不再可以注冊$_SESSION變量。

2、$_SESSION=array() 刪除多個session

3、session_destroy()結(jié)束當(dāng)前的會話,并清空會話中的所有資源。。該函數(shù)不會unset(釋放)和當(dāng)前session相關(guān)的全局變量(globalvariables),也不會刪除客戶端的session cookie.PHP默認(rèn)的session是基于cookie的,如果要刪除cookie的話,必須借助setcookie()函數(shù)。

返回值:布爾值。
功能說明:這個函數(shù)結(jié)束當(dāng)前的session,此函數(shù)沒有參數(shù),且返回值均為true

session_unset() 如果使用了$_SESSION,則該函數(shù)不再起作用。由于PHP5必定要使用$_SESSION,所以此函數(shù)可以打入冷宮了。

下面是PHP官方關(guān)于刪除session的案例:

<?php
// 初始化session.
session_start();
/*** 刪除所有的session變量..也可用unset($_SESSION[xxx])逐個刪除。****/
$_SESSION = array();
/***刪除sessin id.由于session默認(rèn)是基于cookie的,所以使用setcookie刪除包含session id的cookie.***/
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// 最后徹底銷毀session.
session_destroy();
?>

由此我們可以得出刪除Session的步驟:

①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()

● SESSION安全:

會話模塊不能保證存放在會話中的信息只能被創(chuàng)建該會話的用戶看到。根據(jù)其存放的數(shù)據(jù),還需要采取更多措施來主動保護(hù)會話的完整性。

評估會話中攜帶的數(shù)據(jù)并實施附加保護(hù)措施通常要付出代價,降低用戶的方便程度。例如,如果要保護(hù)用戶免于受簡單的社交策略侵害(注:指在 URL 中顯示的會話 ID 會被別人在電腦屏幕上看到,或被別的網(wǎng)站通過 HTTP Referer 得到等),則應(yīng)該啟用 session.use_only_cookies。此情形下,客戶端必須無條件啟用 cookie,否則會話就不工作。

有幾種途徑會將現(xiàn)有的會話 ID 泄露給第三方。泄露出的會話 ID 使第三方能夠訪問所有與指定 ID 相關(guān)聯(lián)的資源。第一,URL 攜帶會話 ID。如果連接到外部站點,包含有會話 ID 的 URL 可能會被存在外部站點的 Referer 日志中。第二,較主動的攻擊者可能會偵聽網(wǎng)段的數(shù)據(jù)包。如果未加密,會話 ID 會以明文方式在網(wǎng)絡(luò)中流過。對此的解決方式是在服務(wù)器上實施 SSL 并強(qiáng)制用戶使用。

默認(rèn)情況下,所有與特定會話相關(guān)的數(shù)據(jù)都被存儲在由 INI 選項 session.save_path 指定的目錄下的一個文件中。對每個會話會建立一個文件(不論是否有數(shù)據(jù)與該會話相關(guān))。這是由于每打開一個會話即建立一個文件,不論是否有數(shù)據(jù)寫入到該文件中。注意由于和文件系統(tǒng)協(xié)同工作的限制,此行為有個副作用,有可能造成用戶定制的會話處理器(例如用數(shù)據(jù)庫)丟失了未存儲數(shù)據(jù)的會話。

上面介紹函數(shù)下文將會用到,但還有一些有關(guān)session的函數(shù)也介紹一下:
session_encode
函數(shù)功能:sesssion信息編碼
函數(shù)原型:string session_encode(void);
返回值:字符串
功能說明:返回的字符串中包含全局變量中各變量的名稱與值,形式如:a s:12:"it is a test\";c s:4:"lala"; a是變量名 s:12代表變量a的值"it is a test的長度是12 變量間用分號”;”分隔。
session_decode
函數(shù)功能:sesssion信息解碼
函數(shù)原型:boolean session_decode (string data)
返回值:布爾值
功能說明:這個函數(shù)可將session信息解碼,成功則返回邏輯值true
Php5不再使用session_id,而是把它變成一個常量SID,并保存在cookie中。如果客戶端禁用了cookie,php會自動通過url自動傳動傳遞SID,其條件是設(shè)置php.ini中的session.use_trans_sid = 1。此時即使客戶端即使禁用了cookie也沒關(guān)系了。
用 strip_tags() 來輸出 SID 以避免 XSS 相關(guān)的攻擊。

Session跨頁傳遞問題:

session跨頁傳遞需要考慮三種情況:

①客戶端禁用了cookie。
②瀏覽器出現(xiàn)問題,暫時無法存取cookie
③php.ini中的session.use_trans_sid = 0或者編譯時沒有打開--enable-trans-sid選項
為什么會這樣呢?下面解釋一下原因:

Session文件分為兩部分:session變量保存在服務(wù)器端(默認(rèn)以文件方式存儲session);而session id則以cookie形式保存在客戶端。(注意:session默認(rèn)是基于cookie的)。

當(dāng)用戶的瀏覽器向服務(wù)器提出請求時,同時發(fā)送包含session id的cookie(默認(rèn)情況下)。服務(wù)器根據(jù)客戶端提供的session id來得到用戶的文件,即保存在服務(wù)器端的session變量值。事實上,session id可以使用客戶端的Cookie或者Http1.1協(xié)議的Query_String(就是訪問的URL的“?”后面的部分)來傳送給服務(wù)器,然后服務(wù)器讀取Session的目錄……。也就是說,session id是取得存儲在服務(wù)上的session變量的身份證。當(dāng)代碼session_start();運行的時候,就在服務(wù)器上產(chǎn)生了一個session文件,隨之也產(chǎn)生了與之唯一對應(yīng)的一個session id,定義session變量以一定形式存儲在剛才產(chǎn)生的session文件中。通過session id,可以取出定義的變量。跨頁后,為了使用session,你必須又執(zhí)行session_start();將又會產(chǎn)生一個session文件,與之對應(yīng)產(chǎn)生相應(yīng)的session id,用這個session id是取不出前面提到的第一個session文件中的變量的,因為這個session id不是打開它的“鑰匙”。如果在session_start();之前加代碼session_id($session id);將不產(chǎn)生新的session文件,直接讀取與這個id對應(yīng)的session文件。

PHP中的session在默認(rèn)情況下是使用客戶端的Cookie來保存session id的,所以當(dāng)客戶端的cookie出現(xiàn)問題的時候就會影響session了。必須注意的是:session不一定必須依賴cookie,這也是session相比cookie的高明之處。當(dāng)客戶端的Cookie被禁用或出現(xiàn)問題時,PHP會自動把session id附著在URL中,這樣再通過session id就能跨頁使用session變量了。但這種附著也是有一定條件的,其一:“php.ini中的session.use_trans_sid = 1或者編譯時打開打開了--enable-trans-sid選項”;其二:運行PHP的服務(wù)器必須是unix/linux系統(tǒng),windows不具備此項功能。

明白了以上的道理,我們就可以得出解決session跨頁傳遞問題的三條途徑:

1、設(shè)置php.ini中的session.use_trans_sid = 1或者編譯時打開打開了--enable-trans-sid選項,讓PHP自動跨頁傳遞session id。

2、手動通過URL傳值、隱藏表單傳遞session id。

3、用文件、數(shù)據(jù)庫等形式保存session_id,在跨頁過程中手動調(diào)用。

下面舉例說明:

第一種情況:

page1.php
<?php
session_start();
$_SESSION['var1']="中華人民共和國";
$url="<a href="."\"s2.php\">下一頁</a>";
echo $url;
?>
page2.php
<?php
session_start();
echo "傳遞的session變量var1的值為:".$_SESSION['var1'];
?>

運行以上代碼,在客戶端cookie正常的情況下,應(yīng)該可以在得到結(jié)果“中華人民共和國”。
現(xiàn)在你手動關(guān)閉客戶端的cookie,再運行,可能得不到結(jié)果了吧。如果得不到結(jié)果,再“設(shè)置php.ini中的session.use_trans_sid = 1或者編譯時打開打開了--enable-trans-sid選項”,又得到結(jié)果“中華人民共和國”

第二種途徑:

s1.php
<?php
session_start();
$_SESSION['var1']="中華人民共和國";
$sn = session_id();
$url="<a href="."\"s2.php?s=".$sn."\">下一頁</a>"; //PHP5定義了一個常量SID來表示session_id(),$url還可以寫成$url='<a href="page2.php?' . SID . '">下一頁</a>';
echo $url;
?>
s2.php
<?php
session_id($_GET['s']);
session_start();
echo "傳遞的session變量var1的值為:".$_SESSION['var1'];
?>

第三種途徑:

login.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=??????">
</head>
<body>
請登錄:

<form name="login" method="post" action="mylogin1.php">
用戶名:<input type="text" name="name"><br>
口 令:<input type="password" name="pass"><br>
<input type="submit" value="登錄">
</form>
</body>
</html>
mylogin1.php
<?php
$name=$_POST['name'];
$pass=$_POST['pass'];
if(!$name    !$pass) {
echo "用戶名或密碼為空,請<a href=\"login.html\">重新登錄</a>";
die();
}
if (!($name=="laogong" && $pass=="123")) {
echo "用戶名或密碼不正確,請<a href=\"login.html\">重新登錄</a>";
die();
}
//注冊用戶
ob_start();
session_start();
$_SESSION['user']= $name;
$psid=session_id();
$fp=fopen("e:\\tmp\\phpsid.txt","w+");
fwrite($fp,$psid);
fclose($fp);
//身份驗證成功,進(jìn)行相關(guān)操作
echo "已登錄<br>";
echo "<a href=\"mylogin2.php\">下一頁</a>";
?>
mylogin2.php
<?php
$fp=fopen("e:\\tmp\\phpsid.txt","r");
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
if(isset($_SESSION['user']) && $_SESSION['user']="laogong" ) {
echo "已登錄!";
}
else {
//成功登錄進(jìn)行相關(guān)操作
echo "未登錄,無權(quán)訪問";
echo "請<a href=\"login.html\">登錄</a>后瀏覽";
die();
}
?>

該文章在 2012/4/4 0:23:34 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 91看片婬黄大片91桃色 | 久你欧洲野花视频欧洲1 | 人人澡c片人人大片视频 | 日韩免费高清大片在线 | 欧美在线观看一区 | 玖玖国产资源在线 | 国产精品免费视频网站 | 日韩欧美一区二区三区在线观看 | 日本精品一区二区三区在线 | 国产传媒在线 | a欧美日韩国产不卡免费 | 九九视频在线观看视频6 | 女人天堂在线观看国产 | 日韩v国产v欧美v | 成人夜间视频 | 欧美日韩亚州 | a级精品九九九大片免费看 国产精品熟女一区二区不 jizz国产精品网站 | 日韩高清免费 | 五月开心亚洲综合在线 | 欧美+日韩+国产在线 | 精品日韩四区五区六 | 欧美综合自拍亚洲综合网 | 2025国产人妖视频区 | 国产又粗又猛又爽又黄 | 97噜色在线 | 国产日韩欧美一区二 | 日韩中文在线观看视频 | 日韩欧美中文宇幕无敌色 | 国产精品电影久 | 区三区四区 | 国产精品福利电影一区二区 | a级片在线观看 | 丰满美女视频一区二区三区 | 欧美精品黑人粗大视频 | 国偷自产一区二区三区蜜臀 | 玖玖玖视频在线观看视频6 精品国产理论在 | 7m在线视频国产最新 | 国产精品玖玖玖在线资源 | 国产第一在 | 精品国产日韩无影视 | 欧美区精品系列在线观看不卡 |