Cookie禁用了据途,Session還能用嗎钮呀?
?Cookie與 Session,一般認為是兩個獨立的東西昨凡,Session采用的是在服務(wù)器端保持狀態(tài)的方案,而Cookie采用的是在客戶端保持狀態(tài)的方案蚁署。但為什么禁用Cookie就不能得到Session呢便脊?因為Session是用Session ID來確定當(dāng)前對話所對應(yīng)的服務(wù)器Session,而Session ID是通過Cookie來傳遞的光戈,禁用Cookie相當(dāng)于失去了Session ID哪痰,也就得不到Session了。
是不是Cookie讓禁用了久妆,Session就一定不能用了呢晌杰?
1.ASP
在ASP中,Session必須倚賴Cookie才可用筷弦,Session是存儲在服務(wù)器端的肋演,而Cookie是存儲在客戶端的,相對而言烂琴,Session的安全性和可靠程度都比Cookie高爹殊。
2.PHP
在PHP中,通過相關(guān)的配置奸绷,可以讓Session不依賴Cookie而存在梗夸。這是因為:? ?????? Session,儲存于服務(wù)器端(默認以文件方式存儲Session)号醉,根據(jù)客戶端提供的Session? ID來得到用戶的文件反症,取得變量的值,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在默認情況下是使用客戶端的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”選項株扛。? ?????? 用過論壇的朋友都知道尤筐,在進入論壇的時候,往往會提示你檢查Cookie是否打開席里,這是因為大多數(shù)論壇都是基于Cookie的叔磷,論壇用它來保存用戶名、密碼等用戶信息奖磁,方便使用改基。而且很多朋友都認為Cookie不安全(其實不是這樣),往往禁用它咖为。其實在PHP程序中秕狰,我們完全可以用Session來代替Cookie,它可以不依賴于客戶端是否開啟Cookie躁染。? ?????? 所以鸣哀,我們可以拋開Cookie使用Session,即假定用戶關(guān)閉Cookie的情況下使用Session吞彤,其實現(xiàn)途徑有以下幾種:
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)用。
途徑一舉例說明
<?php
// s1.php
session_start();
$_SESSION[’var1’]="中華人民共和國";
$url="<a ;
echo$url;
?>
<?php
// s2.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é)果“中華人民共和國”。?
途徑二舉例說明
<?php
// s1.php
session_start();
$_SESSION[’var1’]="中華人民共和國";
$sn=session_id();
$url="<a .$_SESSION[’var1’];
?>
途徑三舉例說明
<!--login.html-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Login</title>
<metahttp-equiv="Content-Type"content="text/html; charset=gb2312">
</head>
<body>
? ? ?? 請登錄:
<formname="login"method="post"action="mylogin1.php">
用戶名:<inputtype="text"name="name"><br>
口 令:<inputtype="password"name="pass"><br>
<inputtype="submit"value="登錄">
</form>
</body>
</html>
//mylogin1.php
<?php
$name=$_POST[’name’];
$pass=$_POST[’pass’];
if(!$name||!$pass) {
echo"用戶名或密碼為空,請<a ;
die();
?? }
if(!($name=="laigw"&&$pass=="1234") {
echo"用戶名或密碼不正確踊餐,請<a ;
die();
?? }
//注冊用戶
ob_start();
session_start();
$_SESSION[’user’]=$name;
$psid=session_id();
$fp=fopen("D:\tmp\phpsid.txt","w+");
fwrite($fp,$psid);
fclose($fp);
//身份驗證成功景醇,進行相關(guān)操作
echo"已登錄<br>";
echo"<a 請<a ;
die();
}
?>
同樣請關(guān)閉Cookie測試,用戶名:laigw吝岭;密碼:1234三痰;這是通過文件保存Session ID的,文件是:D:/tmp/phpsid.txt窜管,請根據(jù)自己的系統(tǒng)決定文件名或路徑散劫。?? ??????
總結(jié)一下,上面的方法有一個共同點幕帆,就是在前一頁取得Session ID获搏,然后想辦法傳遞到下一頁,在下一頁的session_start();代碼之前加代碼Session ID(傳過來的Session ID)失乾。