瀏覽器在不開啟Cookie下Session處理小結


 記得剛開始接觸web開發的時候就遇到這類的問題關於Session和Cookie的一些爭論。兩者都是用來暫存數據的,這里就不說Session和Cookie的區別了,一般情況下Session需要Cookie的支持,但是有時候客戶端安全設置高了那么Cookie就會被禁用(雖然到現在我還沒有在實際開發中遇到過)但是這種情況是確實會存在的。下面我們來說下在Cookie禁用了以后Session怎么用,(注意:在一個腳本是可以用的 關鍵同一服務器不同腳本的訪問)

首先Session依賴Cookie的地方在於Cookie記錄下一個唯一的標識 sessionid,服務器端默認的會讀取客戶端的cookie中的sessionid如果沒有的情況下那么session就會丟失,那么關鍵點就在於sessionid的獲取上。

其次如果只有sessionid那么也是無法獲取或者解析session中的這個id的數據那么這個問題就是session的存儲問題,如果禁用了cookie那么session的存儲就要我們特別處理不管是存到數據庫還是文件中,需要單獨存儲,這里因為為了腳本的簡單就用sessionid 作為文件名存儲session的數據

今天寫了一個小腳本用來測試,

第一步:這一步是我在做測試中突然想到的如果客戶端禁用了Javascript這里必須支持Javascript所以要驗證下

 

  
 
 
  1. <html> 
  2. <head> 
  3. <title>客戶端Javascript/Cookie/Session 檢測</title> 
  4. <meta charset="UTF-8"/> 
  5. <script type="text/Javascript"
  6.     var phpZF = {}; 
  7.     phpZF.checkJavascriptEnable = function(){//檢查瀏覽器是否支持Javascript 
  8.             var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable'); 
  9.             check_javascript_enable.parentNode.removeChild(check_javascript_enable); 
  10.     } 
  11.  
  12.     window.onload = function(){ //這里用的是onload domready更好,要判斷domready需要另寫代碼,回頭單獨寫 
  13.         phpZF.checkJavascriptEnable();//檢查瀏覽器是否支持Javascript 
  14.  
  15.     } 
  16.  
  17. </script> 
  18. </head> 
  19. <body> 
  20.     <div id="phpZF_check_javascript_enable"><h1>您的瀏覽器沒有開啟Javascript,本網站將無法正常運行,請開啟Javascript</h1></div> 
  21. </body> 
  22. </html> 

如果客戶端不支持Javascript那么就會有文本提示讓用戶開啟

第二步:檢測是否支持Cookie

關鍵函數

  
 
 
  1. phpZF.checkCookieEnable = function(){//檢查瀏覽器是否開啟Cookie 
  2.         var cookie_enable = false
  3.         if(navigator.cookiesEnabled) 
  4.             return true
  5.         document.cookie = "checkCookie=yes"
  6.         var cookieSet = document.cookie; 
  7.         if(cookieSet.indexOf("checkCookie=yes") > -1) 
  8.             cookie_enable = true
  9.         document.cookie = ""
  10.         return cookie_enable; 

如果開啟那么很好我們正常流程走

假如不開啟,那么我會在瀏覽器載入完成后的時候重新載入,不過這次載入我會在原來的url后面加上一個瀏覽器不支持cookie的參數

PHP接收后就會特別處理session 

關鍵函數

Javascript

  
 
 
  1. phpZF.unableCookieShareSession = function() { //在關閉Cookie的情況下使用session 
  2.     alert('對不起,您的瀏覽器Cookie功能禁用,請開啟'); 
  3.     var session_id = '<?php echo $session_id;?>'
  4.     var parms=new RegExp("[?]"); 
  5.     if(session_id == 0){ 
  6.         var newURL = document.URL + '?CookieUnable=1'
  7.         if(parms.exec(document.URL) !== null
  8.             newURL = document.URL + '&CookieUnable=1'
  9.         window.location.href = newURL; 
  10.     }else
  11.         var share_Session = document.getElementById('phpZF_share_Session'); 
  12.         if(parms.exec(share_Session.href) !== null){ 
  13.             share_Session.href = share_Session.href + '&session_id='+session_id; 
  14.         } else { 
  15.             share_Session.href = share_Session.href + '?session_id='+session_id; 
  16.         } 
  17.     } 

PHP

 

  
 
 
  1. <?php 
  2. session_start(); 
  3. isset($_SESSION['session'])?null:$_SESSION['session']='session'
  4. if(@$_GET['CookieUnable'] == '1' ){//如果當前瀏覽器關閉cookie 那么重新加載 
  5.     $session_id = session_id(); //獲取當前的session_id; 
  6.     $file_name = $session_id.'.txt';//這里暫時用文件保存 可以用任何的存儲介質,通常為數據庫這里為了講述方法用創建文件解決 
  7.     $handle = fopen($file_name,'w'); 
  8.     fwrite($handle, serialize($_SESSION)); 
  9.     fclose($handle); 
  10. }else
  11.     $session_id = 0; 
  12. ?> 

然后在頁面中我會對特定的url中加上session_id 這樣在網站中就可以使用session_id了

 

 

  
 
 
  1. <body> 
  2.     <div id="phpZF_check_javascript_enable"><h1>您的瀏覽器沒有開啟Javascript,本網站將無法正常運行,請開啟Javascript</h1></div> 
  3.     <div> 
  4.         <a id="phpZF_share_Session" href="show.php">Server Session Information</a>
  5.     </div> 
  6. </body> 
  7. </html> 

那么這樣就算處理完成,整體的代碼

目錄結構:

set.php //入口

show.php //共享session 查看session

20rt5ja239sipblatlng8o0084.txt//這個你可以指定個目錄或者數據庫存儲 session數據

20rt5ja2*************o0084.txt 

set.php Code

 

  
 
 
  1. <?php 
  2. session_start(); 
  3. isset($_SESSION['session'])?null:$_SESSION['session']='session'
  4. if(@$_GET['CookieUnable'] == '1' ){//如果當前瀏覽器關閉cookie 那么重新加載 
  5.     $session_id = session_id(); //獲取當前的session_id; 
  6.     $file_name = $session_id.'.txt';//這里暫時用文件保存 可以用任何的存儲介質,通常為數據庫這里為了講述方法用創建文件解決 
  7.     $handle = fopen($file_name,'w'); 
  8.     fwrite($handle, serialize($_SESSION)); 
  9.     fclose($handle); 
  10. }else
  11.     $session_id = 0; 
  12. ?> 
  13. <html> 
  14. <head> 
  15. <title>客戶端Javascript/Cookie/Session 檢測</title> 
  16. <meta charset="UTF-8"/> 
  17. <script type="text/Javascript"
  18.     var phpZF = {}; 
  19.     phpZF.checkJavascriptEnable = function(){//檢查瀏覽器是否支持Javascript 
  20.             var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable'); 
  21.             check_javascript_enable.parentNode.removeChild(check_javascript_enable); 
  22.     } 
  23.     phpZF.checkCookieEnable = function(){//檢查瀏覽器是否開啟Cookie 
  24.             var cookie_enable = false; 
  25.             if(navigator.cookiesEnabled) 
  26.                 return true; 
  27.             document.cookie = "checkCookie=yes"
  28.             var cookieSet = document.cookie; 
  29.             if(cookieSet.indexOf("checkCookie=yes") > -1) 
  30.                 cookie_enable = true; 
  31.             document.cookie = ""
  32.             return cookie_enable; 
  33.     } 
  34.     phpZF.unableCookieShareSession = function() { //在關閉Cookie的情況下使用session 
  35.         alert('對不起,您的瀏覽器Cookie功能禁用,請開啟'); 
  36.         var session_id = '<?php echo $session_id;?>'
  37.         var parms=new RegExp("[?]"); 
  38.         if(session_id == 0){ 
  39.             var newURL = document.URL + '?CookieUnable=1'
  40.             if(parms.exec(document.URL) !== null) 
  41.                 newURL = document.URL + '&CookieUnable=1'
  42.             window.location.href = newURL; 
  43.         }else
  44.             var share_Session = document.getElementById('phpZF_share_Session'); 
  45.             if(parms.exec(share_Session.href) !== null){ 
  46.                 share_Session.href = share_Session.href + '&session_id='+session_id; 
  47.             } else { 
  48.                 share_Session.href = share_Session.href + '?session_id='+session_id; 
  49.             } 
  50.         } 
  51.     } 
  52.  
  53.     window.onload = function(){ //這里用的是onload domready更好,要判斷domready需要另寫代碼,回頭單獨寫 
  54.         phpZF.checkJavascriptEnable();//檢查瀏覽器是否支持Javascript 
  55.         if(!phpZF.checkCookieEnable())//檢查瀏覽器是否支持Cookie 
  56.             phpZF.unableCookieShareSession();//在不支持Cookie的情況下處理session問題 
  57.     } 
  58.  
  59. </script> 
  60. </head> 
  61. <body> 
  62.     <div id="phpZF_check_javascript_enable"><h1>您的瀏覽器沒有開啟Javascript,本網站將無法正常運行,請開啟Javascript</h1></div> 
  63.     <div> 
  64.         <a id="phpZF_share_Session" href="show.php">Server Session Information</a>; 
  65.     </div> 
  66. </body> 
  67. </html> 

show.php Code

  
 
 
  1. <?php 
  2. if(isset($_GET['session_id'])){ 
  3.     header("Content-type:text/html;charset=UTF-8"); 
  4.     $file_name = $_GET['session_id'].'.txt'
  5.     if(file_exists($file_name)){ 
  6.         $Session = unserialize(file_get_contents($file_name)); 
  7.         echo '<pre>關閉Cookie下'
  8.         print_r($Session); 
  9.     } 
  10. }else
  11.     session_start(); 
  12.     header("Content-type:text/html;charset=UTF-8"); 
  13.     echo '<pre>開啟Cookie下'
  14.     print_r($_SESSION); 

Session 存儲文件內容 我這里序列化了數組保存

a:1:{s:7:"session";s:7:"session";}

基本上就這些,哈哈雖然有點凌亂但是終於解決了,以前一直拖,拖着不是個事,早晚要解決,就算到一點嘿嘿值得滴!

結果是這樣滴:作為參考

圖一:

 

本文出自 “web開發之php” 博客,請務必保留此出處http://phpzf.blog.51cto.com/3011675/792298


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com