cookie && session
1:cookie 是存於本地瀏覽器中而不是服務器中 有生命周期有生成條件 可被服務器和瀏覽器讀取 一般用於存儲用戶信息
1.1.13 案例:永久登錄
如果用戶是在自己家的電腦上上網,登錄時就可以記住他的登錄信息,下次訪問時不需要再次登錄,直接訪問即可。實現方法是把登錄信息如賬號、密碼等保存在Cookie中,並控制Cookie的有效期,下次訪問時再驗證Cookie中的登錄信息即可。
保存登錄信息有多種方案。最直接的是把用戶名與密碼都保持到Cookie中,下次訪問時檢查Cookie中的用戶名與密碼,與數據庫比較。這是一種比較危險的選擇,一般不把密碼等重要信息保存到Cookie中。
還有一種方案是把密碼加密後保存到Cookie中,下次訪問時解密並與數據庫比較
這幾種方案驗證賬號時都要查詢數據庫。
本例將采用另一種方案,只在登錄時查詢一次數據庫,以後訪問驗證登錄信息時不再查詢數據庫。實現方式是把賬號按照一定的規則加密後,連同賬號一塊保存到Cookie中。下次訪問時只需要判斷賬號的加密規則是否正確即可。本例把賬號保存到名為account的Cookie中,把賬號連同密鑰用MD1算法加密後保存到名為ssid的Cookie中。驗證時驗證Cookie中的賬號與密鑰加密後是否與Cookie中的ssid相等
2:session 是存於服務器中存儲信息 生命周期 存於瀏覽器開啟的時間段 需通過session_id 來獲取 而session_id 一般存於cookie中(由於采用服務器端保持狀態的方案在客戶端也需要保存一個標識 這個標示便是指seesion_id 一般存儲於cookie中 如有其他存儲方式亦是ok);
但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時
仍然能夠把session id傳遞回服務器。
經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。還有一種技術叫做表單隱藏字段。就是服務器
會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。比如:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
</form>
實際上這種技術可以簡單的用對action應用URL重寫來代替。
圖片驗證代碼實例:
<?Php
$c=isset($_GET[‘c‘])?isset($_GET[‘c‘]):0;
if(isset($_GET[‘a‘])){//驗證程序
if(isset($_POST[‘data‘])){
session_start();
$pdata=$_POST[‘data‘];
$data=$_SESSION[‘data‘];
echo $pdata.$data;
if($pdata==$data){
echo "ok";
}else{
echo "wrong";
}
}
die();
}
if($c==0){
if(!isset($_COOKIE[‘test‘])){//測試cookie
setcookie("test","jayx",time()+1000,‘‘,‘desktop‘);
echo "NULL";
}else{
echo $_COOKIE[‘test‘]."<br />";
}
}else if($c==1){
header(‘Content-Type: image/jpeg‘); //JPG、JPEG //生成圖片頁面
session_start();
$data=rand(1000,9999);
function creat_image( $width, $height, $authnum)
{
srand((double)microtime()*1000000);
$im = imagecreate( $width, $height);
$black = ImageColorAllocate( $im, 0,0,0);
$white = ImageColorAllocate( $im, 255,255,255);
$gray = ImageColorAllocate( $im, 200,200,200);
imagefill( $im,0,0, $gray);
//將四位整數驗證碼繪入圖片
imagestring( $im, 5, 10, 3, $authnum, $black);
for( $i=0; $i<200; $i++)
{
$randcolor = ImageColorallocate( $im,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel( $im, rand()%70 , rand()%30 , $randcolor);
}
ImagePNG( $im);
ImageDestroy( $im);
}
creat_image(60,20, $data);
$_SESSION[‘data‘]=$data;
}
?>
<?php if($c==0){?>
<html>
<input type="text" width="100" name="data" /><img src="./se.php?c=1" width="100" height="100" id="cimg"/><input type="button" value="sub" />
</html>
<script src="./jquery.js"></script>
<script>
$(function(){
$("input[type=‘button‘]").click(function(){
var data=$("input[name=‘data‘]").val();
console.log(data);
$.post("./se.php?a=check",{data:data},function(msg){
alert(msg);
})
});
$("#cimg").click(function(){
$(this).attr("src","./se.php?c=1&r="+Math.random());
})
})
</script>
<?Php }?>
cookie && session