yxhxj2006

          常用鏈接

          統(tǒng)計

          最新評論

          cookie與session的關(guān)系

          為什么會有cookie呢,大家都知道,http是無狀態(tài)的協(xié)議,客戶每次讀取web頁面時,服務(wù)器都打開新的會話,而且服務(wù)器也不會自動維護客戶的上下文信息,那么要怎么才能實現(xiàn)網(wǎng)上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務(wù)器端,通過 SessionID來區(qū)分不同的客戶,session是以cookie或URL重寫為基礎(chǔ)的,默認(rèn)使用cookie來實現(xiàn),系統(tǒng)會創(chuàng)造一個名為 JSESSIONID的輸出cookie,我們叫做session cookie,以區(qū)別persistent cookies,也就是我們通常所說的cookie,注意session cookie是存儲于瀏覽器內(nèi)存中的,并不是寫到硬盤上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當(dāng)我們把瀏覽器的cookie禁止后,web服務(wù)器會采用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到 sessionid=KWJHUG6JJM65HS2K6之類的字符串。 
                  明白了原理,我們就可以很容易的分辨出persistent cookies和session cookie的區(qū)別了,網(wǎng)上那些關(guān)于兩者安全性的討論也就一目了然了,session cookie針對某一次會話而言,會話結(jié)束session cookie也就隨著消失了,而persistent cookie只是存在于客戶端硬盤上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如 session cookie安全了。 
                  通常session cookie是不能跨窗口使用的,當(dāng)你新開了一個瀏覽器窗口進入相同頁面時,系統(tǒng)會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistent cookie中,然后在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過session cookie和persistent cookie的結(jié)合我們就實現(xiàn)了跨窗口的session tracking(會話跟蹤)。 
                  在一些web開發(fā)的書中,往往只是簡單的把Session和cookie作為兩種并列的http傳送信息的方式,session cookies位于服務(wù)器端,persistent cookie位于客戶端,可是session又是以cookie為基礎(chǔ)的,明白的兩者之間的聯(lián)系和 
          區(qū)別,我們就不難選擇合適的技術(shù)來開發(fā)web service了 
          cookie 
          Session是由應(yīng)用服務(wù)器維持的一個服務(wù)器端的存儲空間,用戶在連接服務(wù)器時,會由服務(wù)器生成一個唯一的SessionID,用該SessionID 為標(biāo)識符來存取服務(wù)器端的Session存儲空間。而SessionID這一數(shù)據(jù)則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務(wù)器端,來存取Session數(shù)據(jù)。這一過程,是不用開發(fā)人員干預(yù)的。所以一旦客戶端禁用Cookie,那么Session也會失效。 

          服務(wù)器也可以通過URL重寫的方式來傳遞SessionID的值,因此不是完全依賴Cookie。如果客戶端Cookie禁用,則服務(wù)器可以自動通過重寫URL的方式來保存Session的值,并且這個過程對程序員透明。 

          可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數(shù)組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進制的字符串,是SessionID的值。 
          Cookie是客戶端的存儲空間,由瀏覽器來維持。
           
          總結(jié):
          1:cookie是通過頭部header返回到瀏覽器中并保存在磁盤中,下次再次訪問該服務(wù)器中。瀏覽器會自動把該cookie傳輸?shù)椒?wù)器中。
          2:Session與Cookie是一對的,Session使用的基礎(chǔ)就是cookie。
          3:cookie分為兩種,如果設(shè)置cookie時沒有設(shè)置有效時間,就表示該cookie是臨時性的,只保存在瀏覽器的內(nèi)存中,即seesion-cookie,只要關(guān)閉瀏覽器,該cookie即將消失。
                                    如果cookie設(shè)置了有效時間,就表示該cookie是持久化的,即persistent cookie。此外還可以為持久化cookie設(shè)置域名和路徑。
          4:當(dāng)禁止cookie后,就返回通過url地址返回cookie Id。
          5:如來是否自定義cookie值,服務(wù)器都會自動產(chǎn)生一個cookie值,名稱為:
          JSESSIONID,而值就是服務(wù)器中的sessionid值。

          創(chuàng)建cookie的步驟: 以java為例:
           1: 創(chuàng)建cookie對象:Cookie cookie = new Cookie("cookiename","cookievalue"); 
           2:設(shè)置有效期:cookie.setMaxAge(3600); 
           3:設(shè)置路徑:cookie.setPath("/"); //設(shè)置路徑,這個路徑即該工程下都可以訪問該cookie 如果不設(shè)置路徑,那么只有設(shè)置該cookie路徑及其子路徑可以訪問 
           4:設(shè)置域名:cookie.setDomain(".zl.org") ;  //域名要以“.”開頭 
           5:在返回對象中添加cookie對象:response.addCookie(cookie) ; 
           6:返回對象response其他的操作。

          以下為Java操作Cookie實例:
          java對cookie的操作比較簡單,主要介紹下建立cookie和讀取cookie,以及如何設(shè)定cookie的生命周期和cookie的路徑問題。

          建立一個無生命周期的cookie,即隨著瀏覽器的關(guān)閉即消失的cookie,代碼如下

          HttpServletRequest request  
          HttpServletResponse response
          Cookie cookie = new Cookie("cookiename","cookievalue");
          response.addCookie(cookie);
           
          下面建立一個有生命周期的cookie,可以設(shè)置他的生命周期

          cookie = new Cookie("cookiename","cookievalue");
           
          cookie.setMaxAge(3600);
           
          //設(shè)置路徑,這個路徑即該工程下都可以訪問該cookie 如果不設(shè)置路徑,那么只有設(shè)置該cookie路徑及其子路徑可以訪問
           
          cookie.setPath("/");
          response.addCookie(cookie);
           

          下面介紹如何讀取cookie,讀取cookie代碼如下

          Cookie[] cookies = request.getCookies();//這樣便可以獲取一個cookie數(shù)組
          for(Cookie cookie : cookies){
              cookie.getName();// get the cookie name
              cookie.getValue(); // get the cookie value
          }
           

          上面就是基本的讀寫cookie的操作。我們在實際中最好進行一下封裝,比如增加一個cookie,我們關(guān)注的是cookie的name,value,生命周期,所以進行封裝一個函數(shù),當(dāng)然還要傳入一個response對象,addCookie()代碼如下

          /**
           * 設(shè)置cookie
           * 
          @param response
           * 
          @param name  cookie名字
           * 
          @param value cookie值
           * 
          @param maxAge cookie生命周期  以秒為單位
           
          */
          public static void addCookie(HttpServletResponse response,String name,String value,int maxAge){
              Cookie cookie = new Cookie(name,value);
              cookie.setPath("/");
              if(maxAge>0)  cookie.setMaxAge(maxAge);
              response.addCookie(cookie);
          }
           

          讀取cookie的時候,為了方便我們的操作,我們希望封裝一個函數(shù),只要我們提供cookie的name,我們便可以獲取cookie的value,帶著這個想法,很容易想到將cookie封裝到Map里面,于是進行下面的封裝.
          /**
           * 根據(jù)名字獲取cookie
           * 
          @param request
           * 
          @param name cookie名字
           * 
          @return
           
          */
          public static Cookie getCookieByName(HttpServletRequest request,String name){
              Map<String,Cookie> cookieMap = ReadCookieMap(request);
              if(cookieMap.containsKey(name)){
                  Cookie cookie = (Cookie)cookieMap.get(name);
                  return cookie;
              }else{
                  return null;
              }   
          }
            
          /**
           * 將cookie封裝到Map里面
           * 
          @param request
           * 
          @return
           
          */
          private static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){  
              Map<String,Cookie> cookieMap = new HashMap<String,Cookie>();
              Cookie[] cookies = request.getCookies();
              if(null!=cookies){
                  for(Cookie cookie : cookies){
                      cookieMap.put(cookie.getName(), cookie);
                  }
              }
              return cookieMap;
          }

          posted on 2013-11-26 00:01 奮斗成就男人 閱讀(177) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 鲁甸县| 靖边县| 临沧市| 嫩江县| 西丰县| 博湖县| 横山县| 阳高县| 邹城市| 达孜县| 关岭| 汉沽区| 淮南市| 民县| 耒阳市| 沂南县| 濉溪县| 石狮市| 唐海县| 台湾省| 绥化市| 凤山市| 吉木乃县| 伊宁县| 高密市| 黄梅县| 永年县| 天等县| 克东县| 新宾| 临清市| 道孚县| 七台河市| 喜德县| 法库县| 吉首市| 铁岭县| 江陵县| 海口市| 宁乡县| 齐河县|