首頁  >  文章  >  後端開發  >  Cookie禁用了,Session還能用嗎?

Cookie禁用了,Session還能用嗎?

WBOY
WBOY原創
2016-07-28 08:28:211044瀏覽
   Cookie與 Session,一般認為是兩個獨立的東西,Session採用的是在伺服器端保持狀態的方案,而Cookie採用的是在客戶端保持狀態的方案。但為什麼禁用Cookie就不能得到Session呢?因為Session是用Session ID來確定目前對話所對應的伺服器Session,而Session ID是透過Cookie來傳遞的,禁用Cookie相當於失去了Session ID,也就得不到Session了。
       是不是Cookie讓停用了,Session就一定不能用了呢?
       1. ASP
       在ASP中,Session必須倚賴Cookie才可用,Session是儲存在伺服器端的,而Cookie是儲存在客戶端的,相對而言,Session的安全性和可靠度都比Cookie高。
       2. PHP
       在PHP中,且透過相關的配置,且可讓Session不依賴Cookie而存在。這是因為:
       Session,儲存於伺服器端(預設以文件方式儲存Session),根據客戶端提供的Session ID來得到使用者的文件,取得變數的值,Session ID可以使用客戶端的Cookie或Http1. 1協定的Query_String(就是存取的URL的「?」後面的部分)來傳送給伺服器,然後伺服器讀取Session的目錄…。也就是說,Session ID是取得儲存在服務上的Session變數的身分證。當程式碼session_start();運行的時候,就在伺服器上產生了一個Session文件,隨之也產生了與之唯一對應的一個Session ID,定義Session變數以某種形式儲存在剛才產生的Session檔案中。透過Session ID,可以取出定義的變數。跨頁後,為了使用Session,你必須又執行session_start();將會又會產生一個Session文件,與之對應產生對應的Session ID,用這個session id是取不出前面提到的第一個Session文件中的變數的,因為這個Session ID不是打開它的「鑰匙」。如果在session_start();之前加上程式碼session_id($session id);將不產生新的Session文件,直接讀取與這個id對應的Session文件。
       PHP中的Session預設是使用客戶端的Cookie來儲存Session ID的,所以當客戶端的cookie出現問題的時候就會影響Session了。必須注意的是:Session不一定必須依賴Cookie,這也是Session相比Cookie的高明之處。當客戶端的Cookie被停用或出現問題時,PHP會自動把Session ID附著在URL中,這樣再透過Session ID就能跨頁使用Session變數了。但這種附著也是有一定條件的,即「php.ini中的session.use_trans_sid = 1“,或編譯時打開打開了“--enable-trans-sid”選項。
       用過論壇的朋友都知道,在進入論壇的時候,往往會提示你檢查Cookie是否打開,這是因為大多數論壇都是基於Cookie的,論壇用它來保存用戶名、密碼等用戶訊息,方便使用。完全可以用Session來代替Cookie,它可以不依賴於客戶端是否開啟Cookie。 :
       1. 設定php.ini設定檔中的“session.use_trans_sid = 1”,或在編譯時開啟了“--enable-trans-sid”選項,讓PHP自動跨頁傳遞Session ID。 >       2. 手動透過URL傳值、隱藏表單傳遞Session ID。 -------------------------------------------------- -------------------------------------------------- --------------
                  // s1.php
           session_start()           $url="下一頁";
       url;
       ?>
       ---------------------------------------- -------------------------------------------------- -------------------------
       ---------------------- -------------------------------------------------- -------------------------------------------
                  // s2.php
           session_start();
        ses   ?>
       ---- -------------------------------------------------- -------------------------------------------------- -----------
       執行上述程式碼,在客戶端cookie正常的情況下,應該可以在得到結果"中華人民共和國"。
       現在你手動關閉客戶端的cookie,再運行,可能無法取得結果了吧。如果得不到結果,再設定php.ini檔案中的”session.use_trans_sid = 1“,或編譯時開啟開啟了”--enable-trans-sid選項”,又得到結果「中華人民共和國」。
       途徑2舉例說明:
       --------------------------------------- -------------------------------------------------- --------------------------
                  // s1.php
           session_start();
$_SESSION['var1']="中華人民共和國";
           $sn = session_id();
           $url="下一頁";
           echo $url;
       ?>
            -------------------------------------------------- -------------------------------------------------- ------
       ----------------------------------------- -------------------------------------------------- ------------------------
                  session_id($_GET['s']);
   ;
           echo "傳遞的session變數var1的值為:".$_SESSION['var1'];
       ?> 
   -------------------------------------------------- ------------------------------------------------
       途徑3舉例說明:
       ----------------------------------------- -------------------------------------------------- ------------------------
       login.html
        
        
        
       Login 2">
        
        
       請登入: 
   用戶名:
 
       口令:
 
        
        
        
        
   -------------------------------------------------- ----------------------------------------
       ------- -------------------------------------------------- -------------------------------------------------- --------
       mylogin1.php
              $name=$_POST['name'];
     $name=$_POST['name'];
  8; >       if(!$name || !$pass) {
           echo "使用者名稱或密碼為空,請重新登錄";
           die();
       }
       if (!($name=="laigw" && $pass=="1234") {
           echo "用戶名或密碼不正確,請重新登入";
           die();
           die();
      
       //註冊使用者
       ob_start();
       session_start();
  約id();
       $fp =fopen("D:tmpphpsid.txt","w+");
       fwrite($fp,$psid);
       fclose($fp);
       fclose($fp);
       fclose($fp);
       fclose($fp);
 🎜>       echo "已登入
";
       echo "下一頁";
       ?>
       ------------------------------------------- -------------------------------------------------- ----------------------
       ------------------------- -------------------------------------------------- ----------------------------------------
       mylogin2.php
              $fp=fopen("D:tmpphpsid.txt","r");
       $sid=fread($fp,1024);       session_start();
       if(isset($_SESSION['user']) && $   
       } else {
           //成功登入相關作業
           echo "未登入,無權利存取"; ei2004.blog.163. com/blog/login.html">登入後瀏覽";
           die();
       }
   -------------------------------------------------- -------------------------------------------------- --
       也請關閉Cookie測試,使用者名稱:laigw;密碼:1234;這是透過檔案儲存Session ID的,檔案是:D:/tmp/phpsid.txt,請依照自己的系統決定檔案名稱或路徑。
       總結一下,上面的方法有一個共同點,就是在前一頁取得Session ID,然後想辦法傳遞到下一頁,在下一頁的session_start();代碼之前加代碼Session ID(傳過來的Session ID)。

以上就介紹了 Cookie禁用了,Session還能用嗎? ,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn