首頁 > Java > java教程 > 主體

cookie和session的會話和會話狀態講解

巴扎黑
發布: 2017-07-17 14:30:29
原創
2015 人瀏覽過

一、會話概述

1)現象:#HTTP協定是無狀態的協定,Web伺服器本身無法辨識出哪些請求是同一個瀏覽器發出的,瀏覽器的每個請求都是完全孤立的。

2)解決:借助會話狀態,Web伺服器能夠把屬於同一會話中的一系列請求和回應過程關聯起來。

3)實作:需要瀏覽器對其發出的每個請求訊息都進行標識。 這個識別稱為會話ID(SessionID)。

 

二、Cookie

一:存在兩種類型的cookie:

1>會話cookie (session cookie)

       不設定過期時間,則表示這個cookie生命週期為瀏覽器會話期間,只要關閉瀏覽器窗口,   cookie就消失了。

       生命期為瀏覽器會話期。

       一般不保存在硬碟上而是保存在記憶體裡。

2>持久性cookie (persistent cookies)

       設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie依然有效直到超過設定的過期時間。

       保存在使用者硬碟上,相同瀏覽器可取得。

二: session相關知識

2.1: 什麼是session?

       Session 是一種保存情境資訊的機制,它是針對每個使用者的,變數的值保存在伺服器端,透過sessionid來區分不同的客戶,session是以cookie或url重      寫為基礎.

2.2: session  的工作原則

client———>1.request————————->server

                                      );

   |<————-3.reponse(SESSION_ID)<——–|

   |————->4.request(SESSION_ID)—— —>|

                       5. session_start();

   |<—————6.reponse(SESSION_ID)— |<——— -6.reponse(SESSION_ID)#1— | ———->7. request(SESSION_ID + logout)–>|

                      8. session_destroy();

#1  ookie|文件)<——-|

 

 

client開啟網頁,向server發出請求,client上由於沒有對應的cookie檔案存在,在請求中不輸送SESSION_ID

伺服器在接受到client的請求後,透過執行session_start()函數開始進行session的處理, 首先確認請求中有沒有SESSION_ID,如果沒有的話,發行一個新的SESSION_ID;如果有的話, 則呼叫那個存有SESSION_ID的文件,並把資訊寫入$_SESSION裡去,並存入以sess_開頭的文件裡。

把寫入資訊的$_SESSION參數傳回給client,client在GET伺服器發來的資訊後,把這些資訊保存在cookie裡。

client把cookie裡的SESSION_ID一起寫入header後再向server發出請求。重複1-3的操作

client發出登出請求

伺服器接受請求後,透過執行session_destroy()函數開始刪除session檔案處理

伺服器向client發出刪除儲存在client上的cookie檔的指令:   setcookie(session_name(), ”, time()-60, '/');

 

#2.3: 注意

#通常情況下是不能跨視窗使用,但用sessionid保存在持久cookie中,然後在從新視窗中讀取,就可以得到sessionid,實現跨視窗的使用.

    在大瀏覽量的網站, session不保險,可能會出現重複的sessionid.

    Session ID不能從硬碟上的Cookie檔取得,如果想在客戶端獲知自己的Session ID,只能透過Javascrīpt來讀取。

2.4 php使用及設定

        Session_start() :開始一個會話或傳回已經存在的會話。發生以下錯誤。

如果在session.auto_start=1,會讓session_save_path (‘./t/’);變的無效。因為後一條語句須放前面。

 

2.5 增加PHP的Session儲存與處理能力

      ;session.save_path = 「N;MODE;/path」  這項設定提供給我們可以給session目錄進行多層雜湊,其中「N」表示要設定的目錄級數,

      「MODE」表示目錄的權限屬性,預設為600

 

 2.6 :多伺服器共享php的SESSION

    1、NFS或Samba共享的方法,讓各個伺服器上存放session檔案的磁碟共享,這種方法簡單可行。

    2、集中儲存到資料庫中,這是比較多的實作方法,透過php提供的session_set_save_handler()函數來重定義session函數,建議使用此方法。

 

三: cookie知識

     什麼是 Cookie?其運作方式如何?Cookie 是一小段文字訊息,伴隨著使用者請求和頁面在 Web 伺服器和瀏覽器之間傳遞。當使用者每次造訪網站時,Web 應用程式都可以讀取 Cookie 包含的資訊。 Cookie 的基本運作方式如果使用者再次造訪網站上的頁面,當該使用者輸入 URLwww.*****.com時,瀏覽器就會在本機硬碟上尋找與該 URL 相關聯的 Cookie。如果該 Cookie 存在,瀏覽器就會將它與頁面請求一起傳送到您的網站。 Cookie 有哪些用途?最根本的用途是:Cookie 能夠幫助 Web 網站保存有關訪客的資訊。更概括地說,Cookie 是一種保持Web 應用程式連續性(即執行「狀態管理」)的方法.使Web 網站記住您.

#1、客戶端執行程式請求伺服器發回請求結果並且產生一個cookie給客戶端所以第二次刷新的時候才會有cookie的出現
2、session是保存在記憶體中,跟進程是同時存在的會話cookie,但是此時伺服器端還保存有session檔案需要設定時間來刪除session檔案
3、Cookie是在本地Cookie檔案中保存一些訊息,Cookie檔案中保存的是鍵值對(key-value)。 Cookie檔案存放於你本機電腦系統碟的Document   and   Settings/使用者名稱   目錄下。如果你造訪的網站的名稱為www.abc.com,那麼一般來說,Cookie檔案的名稱為   使用者名稱@abc.com,你可以自己打開資料夾看看。你提到的getName獲得的是保存在Cookie檔案中某一個Cookie的key值。

我們知道,session是在伺服器端保持使用者會話資料的一種方法,對應的cookie是在客戶端保持使用者資料。 HTTP協定是一種無狀態協議,伺服器回應完後就失去了與瀏覽器的聯繫,最早,Netscape將cookie引入瀏覽器,使得資料可以客戶端跨頁面交換,那麼伺服器是如何記住眾多使用者的會話數據呢?
首先要將客戶端和伺服器端建立一一聯繫,每個客戶端都得有一個唯一標識,這樣伺服器才能識別出來。建議唯一識別的方法有兩種:cookie或透過GET方式指定。預設配置的PHP使用session的時會建立一個名叫」PHPSESSID」的cookie(可以透過php.ini修改session.name值指定),如果客戶端停用cookie,你也可以指定透過GET方式把session id傳到伺服器(修改php.ini中session.use_trans_sid等參數)。
我們查看伺服器端session.save_path目錄會發現很多類似sess_vv9lpgf0nmkurgvkba1vbvj915這樣的文件,這個其實就是session id “vv9lpgf0nmkurgvkba1vbvj915〃伺服器上的資料。vv9lpgf0nmkurgvkba1vbvj915〃伺服器上的資料。找到對應的文件,讀取的時候對文件內容進行反序列化就得到session的值,保存的時候先序列化再寫入。

1. 概念

1)

意義:在Web開發環境中,session 是指一類別用來在客戶端與伺服器之間保持狀態的解決方案。保持HTTP狀態資訊。檢查這個客戶端的請求裡是否包含了一個session 標識(即sessionID),即請求裡是否

存放了名為"JESESSIONID",值為sessionID 的

cookie#。

若已存在就檢索出來使用,

  • 否則為此客戶建立一個session,並產生一個與此session 相關聯的sessionID,用set-cookie 方式傳遞給請求,那麼下次請求發出時,就會使用此sessionID 作為cookie 中名為"JESESSIONID"的值進行傳遞sessionID。

  • 4)儲存方式:最常用的是用 cookie 儲存。但如果 cokkie 被停用,必須有其他機制來保存。如URL重寫:把 sessionID 附加在URL路徑後面。

    5)注意:由於是通常是用cookie 來保存的,所以如果讓cookie 持久化就可以在重啟瀏覽器後也能取得到該sessionID。

    //用持久化cookie保存sessionIDCookie cookie = new Cookie("JESESSIONID",session.getId());
    cookie.setMaxAge(20);
    response.addCookie(cookie);
    登入後複製

     

    2. Session的建立

    1)# Session 屬性

    • 若page 指定的Session 屬性預設為true,那麼 第一次存取一個WEB 套用的一個JSP 頁面時,該頁面都必須有一個和這個請求相關聯的Session 物件。

    • 否則JSP 頁面不會要求一定有一個Session 物件和目前的JSP 頁面相關聯,所以第一次造訪JSP頁面時不會建立一個Session 。

    2)request.getSession(boolean flag):

    • true,則一定會傳回一個HttpSession 對象,如果已經有和目前JSP 頁面關聯的HttpSession對象,直接傳回;如果沒有,則建立一個新的返回。

    • false,則若沒有和目前JSP頁面關聯的 HttpSession 物件傳回null,否則傳回取得的HttpSession物件。

    • request.getSession() 相當於 request.getSession(true)。

     

    3. Session物件的銷毀

    1)呼叫HttpSession 的invalidate()方法。

    2)HttpSession 超過過期時間自動銷毀,可以在 Tomcat 的 web.xml 檔案中配置 Session 的最大時效, 單位是分鐘。

    <!-- apache-tomcat-x.x.xx\conf\web.xml --><session-config><session-timeout>30</session-timeout></session-config>#<p> </p>
    <p><span style="color: #000000"><em>相关方法签名:</em></span></p>
    <ul class=" list-paddingleft-2">
    <li><p><span style="color: #000000">int getMaxInactiveInterval()                         //返回最大时效,单位:秒</span></p></li>
    <li><p><span style="color: #000000">void setMaxInactiveInterval(int interval)      //设置最大时效</span></p></li>
    </ul>
    <p><span style="color: #000000">3)服务器卸载当前 WEB 应用。</span></p>
    <p> </p>
    <h2><span style="color: #000000">4.Session相关方法</span></h2>
    <p><span style="color: #000000">String getId()                                                       //得到sessionID</span></p>
    <p><span style="color: #000000">boolean isNew()                                                  //该session是不是新创建的<br></span></p>
    <p><span style="color: #000000">long getCreationTime()                                       //该session被创建的时间<br></span></p>
    <p><span style="color: #000000">long getLastAccessedTime()                              //该session最后一次被访问的时间</span></p>
    <p><span style="color: #000000">void <span style="color: #ff0000">setAttribute</span>(String key, Object value)         //存放值,相当于哈希表<br></span></p>
    <p><span style="color: #000000">Object <span style="color: #ff0000">getAttrbute</span>(String key)                           //根据键从session中取得对应的值</span></p>
    <p> </p>
    <h2><span style="color: #000000">5.URL重写实现Session跟踪</span></h2>
    <p><span style="color: #000000"><em>方法签名:</em>String encodeURL(String url)  //该方法会在URL后面加上sessionID</span></p>
    <div class="cnblogs_code"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">重新登录
    登入後複製
    登入後複製
    重新登录
    登入後複製

     

    以上是cookie和session的會話和會話狀態講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:php.cn
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    最新問題
    熱門推薦
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板