国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

cookie 和session 的區別詳解

2019-11-08 03:18:18
字體:
來源:轉載
供稿:網友

cookie 和session 的區別詳解

這些都是基礎知識,不過有必要做深入了解。先簡單介紹一下。

二者的定義:

當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,

都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie

里的內容來判斷使用者,送出特定的網頁內容給你。 Cookie 的使用很普遍,許多有提供個人化服務的網站,都是利用 Cookie

來辨認使用者,以方便送出使用者量身定做的內容,像是 Web 接口的免費 email 網站,都要用到 Cookie。

具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。

同時我們也看到,由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制

來達到保存標識的目的,但實際上它還有其他選擇。

cookie機制。正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示

瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如javaScript或者VBScript也可以生成cookie。而cookie的使用

是由瀏覽器按照一定的原則在后臺自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍

大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。 cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。若不設置過期時間,則表示這

個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。

會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為并不是規范規定的。若設置了過期時間,瀏覽器就會把cookie

保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的瀏

覽器進程間共享,比如兩個IE窗口。而對于保存在內存里的cookie,不同的瀏覽器有不同的處理方式

session機制。session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。

          當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識

(稱為session id),如果已包含則說明以前已經為此客戶端創建過session,服務器就按照session id把這個session檢索出來

使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session并且生成一個與此session相

關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個session id將被在本次響應

中返回給客戶端保存。保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給

服務器。一般這個cookie的名字都是類似于SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時

仍然能夠把session id傳遞回服務器。

經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的后面。還有一種技術叫做表單隱藏字段。就是服務器

會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。比如: <form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form> 實際上這種技術可以簡單的用對action應用URL重寫來代替。

cookie 和session 的區別:

1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙   考慮到安全應當使用session。

3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能   考慮到減輕服務器性能方面,應當使用COOKIE。

4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

5、所以個人建議:   將登陸信息等重要信息存放為SESSION   其他信息如果需要保留,可以放在COOKIE中

COOKIE和SESSION有什么區別?

似乎Session也要用到Cookie來傳遞信息。Session一般都保存在服務器內存里嗎?如果把它存在文件或者數據庫里,是不是性能開銷也比直接使用Cookie大不少?大量用戶的Web站點,一般是用Session還是Cookie來做用戶驗證?知乎用的是什么?

1. 由于HTTP協議是無狀態的協議,所以服務端需要記錄用戶的狀態時,就需要用某種機制來識具體的用戶,這個機制就是Session.典型的場景比如購物車,當你點擊下單按鈕時,由于HTTP協議無狀態,所以并不知道是哪個用戶操作的,所以服務端要為特定的用戶創建了特定的Session,用用于標識這個用戶,并且跟蹤用戶,這樣才知道購物車里面有幾本書。這個Session是保存在服務端的,有一個唯一標識。在服務端保存Session的方法很多,內存、數據庫、文件都有。集群的時候也要考慮Session的轉移,在大型的網站,一般會有專門的Session服務器集群,用來保存用戶會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務比如Memcached之類的來放 Session。2. 思考一下服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次創建Session的時候,服務端會在HTTP協議中告訴客戶端,需要在 Cookie 里面記錄一個Session ID,以后每次請求把這個會話ID發送到服務器,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤,即每次HTTP交互,URL后面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識別用戶。3. Cookie其實還可以用在一些方便用戶的場景下,設想你某次登陸過一個網站,下次登錄的時候不想再次輸入賬號了,怎么辦?這個信息可以寫到Cookie里面,訪問網站的時候,網站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點甜頭。所以,總結一下:Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中;Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。

1,session 在服務器端,cookie 在客戶端(瀏覽器)2,session 默認被存在在服務器的一個文件里(不是內存)3,session 的運行依賴 session id,而 session id 是存在 cookie 中的,也就是說,如果瀏覽器禁用了 cookie ,同時 session 也會失效(但是可以通過其它方式實現,比如在 url 中傳遞 session_id)4,session 可以放在 文件、數據庫、或內存中都可以。5,用戶驗證這種場合一般會用 session

因此,維持一個會話的核心就是客戶端的唯一標識,即 session id

類似這種面試題,實際上都屬于“開放性”問題,你扯到哪里都可以。不過如果我是面試官的話,我還是希望對方能做到一點——不要混淆 session 和 session 實現。本來 session 是一個抽象概念,開發者為了實現中斷和繼續等操作,將 user agent 和 server 之間一對一的交互,抽象為“會話”,進而衍生出“會話狀態”,也就是 session 的概念。而 cookie 是一個實際存在的東西,http 協議中定義在 header 中的字段。可以認為是 session 的一種后端無狀態實現。而我們今天常說的 “session”,是為了繞開 cookie 的各種限制,通常借助 cookie 本身和后端存儲實現的,一種更高級的會話狀態實現。所以 cookie 和 session,你可以認為是同一層次的概念,也可以認為是不同層次的概念。具體到實現,session 因為 session id 的存在,通常要借助 cookie 實現,但這并非必要,只能說是通用性較好的一種實現方案。COOKIE和SESSION有什么區別?cookie保存在客戶端,session保存在服務器端,cookie目的可以跟蹤會話,也可以保存用戶喜好或者保存用戶名密碼session用來跟蹤會話①當我們登錄網站勾選保存用戶名和密碼的時候,一般保存的都是cookie,將用戶名和密碼的cookie保存到硬盤中,這樣再次登錄的時候瀏覽器直接將cookie發送到服務端驗證,直接username和passWord保存到客戶端,當然這樣不安全,瀏覽器也可以加密解密這樣做,每個瀏覽器都可以有自己的加密解密方式,這樣方便了用戶,再比如用戶喜歡的網頁背景色,比如QQ空間的背景,這些信息也是可以通過cookie保存到客戶端的,這樣登錄之后直接瀏覽器直接就可以拿到相應的偏好設置。②跟蹤會話,比如某些網站中網頁有不同的訪問權限,有只能登錄的用戶訪問的網頁或者用戶級別不同不能訪問的,但是http請求是無狀態的,每次訪問服務端是不知道是否是登錄用戶,很自然的想到在http請求報文中加入登錄標識就可以了,這個登錄標識就可以是cookie,這樣的cookie服務端要保存有所有登錄用戶的cookie,這樣請求報文來了之后拿到登錄標識cookie,在服務端進行比較久可以了。再比如購物網站,多次點擊添加商品到購物車客戶端很容易知道哪些物品在購物車中,但是服務端怎么知道每次添加的物品放到哪個登錄用戶的購物車中呢?也需要請求報文中帶著cookie才行(在不登陸的情況下京東也是可以不斷添加商品的,推測應該是登錄的時候一并創建cookie并且發送物品信息),這些cookie都是為了跟蹤會話用的,所以客戶端有,服務端也有,并且服務端有全部的會話cookie。后面衍生出session技術,session技術是要使用到cookie的,之所以出現session技術,主要是為了安全。

http是無狀態的協議,客戶每次讀取web頁面時,服務器都打開新的會話,而且服務器也不會自動維護客戶的上下文信息,那么要怎么才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,默認使用cookie來實現,系統會創造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是存儲于瀏覽器內存中的,并不是寫到硬盤上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止后,web服務器會采用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到 sessionid=KWJHUG6JJM65HS2K6之類的字符串。

&amp;lt;img src=&quot;https://pic3.zhimg.com/249c3f10f411af56640113b615c972be_b.png&quot; data-rawwidth=&quot;897&quot; data-rawheight=&quot;529&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;897&quot; data-original=&quot;https://pic3.zhimg.com/249c3f10f411af56640113b615c972be_r.png&quot;&amp;gt;大家請看在HTTP請求報文頭的最后一行有cookie,不過是JSessionID的cookie值大家請看在HTTP請求報文頭的最后一行有cookie,不過是JSessionID的cookie值

Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C

比如前兩個值,應該屬于偏好設置之類的。

服務端是怎么知道客戶端的多個請求是隸屬于一個Session呢?注意到后臺的那個jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原來就是通過HTTP請求報文頭的Cookie屬性的jsessionid的值關聯起來的!(當然也可以通過重寫URL的方式將會話ID附帶在每個URL的后面哦)。明白了原理,我們就可以很容易的分辨出persistent cookies和session cookie的區別了,網上那些關于兩者安全性的討論也就一目了然了,session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie只是存在于客戶端硬盤上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如 session cookie安全了。

通常session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistent cookie中,然后在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨窗口的session tracking(會話跟蹤)。在一些web開發的書中,往往只是簡單的把Session和cookie作為兩種并列的http傳送信息的方式,session cookies位于服務器端,persistent cookie位于客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯系和區別,我們就不難選擇合適的技術來開發web service了。

部分參考自:session與cookie的區別===================分割線==============舉個QQ空間的例子:① 當我們登錄QQ空間的時候,可以選擇保存用戶名和密碼,這樣下次登錄的時候瀏覽器可以自動填充或者自動登陸,此時使用的是cookie技術,將于
http://qzone.qq.com/域名對應的cookie保存到硬盤中,下次訪問的時候瀏覽器查找保存在硬盤中的與該域名對應的cookie填充。②登錄之后,我們可能做些操作,比如刪除日志,發表說說,這些只有登錄用戶才能做的事情可以使用cookie也可以使用session進行會話跟蹤③空間的喜好設置可以保存到硬盤cookie當中。-------------------------------------------------------------------------------------------------------------------------其實說白了session就是用來保存會話的cookie。下面介紹下Java中Servlet的session管理
http://lavasoft.blog.51cto.com/62575/275589  深入理解HTTP Sessionsession在web開發中是一個非常重要的概念,這個概念很抽象,很難定義,也是最讓人迷惑的一個名詞,也是最多被濫用的名字之一,在不同的場合,session一次的含義也很不相同。這里只探討HTTP Session。為了說明問題,這里基于Java Servlet理解Session的概念與原理,這里所說Servlet已經涵蓋了jsp技術,因為JSP最終也會被編譯為Servlet,兩者有著相同的本質。在Java中,HTTP的Session對象用javax.servlet.http.HttpSession來表示。1、概念:Session代表服務器與瀏覽器的一次會話過程,這個過程是連續的,也可以時斷時續的。在Servlet中,session指的是HttpSession類的對象,這個概念到此結束了,也許會很模糊,但只有看完本文,才能真正有個深刻理解。2、Session創建的時間是:一個常見的誤解是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果JSP沒有顯示的使用 <% @page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對象的來歷。由于session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。引申:1)、訪問*.html的靜態資源因為不會被編譯為Servlet,也就不涉及session的問題。2)、當JSP頁面沒有顯式禁止session的時候,在打開瀏覽器第一次請求該jsp的時候,服務器會自動為其創建一個session,并賦予其一個sessionID,發送給客戶端的瀏覽器。以后客戶端接著請求本應用中其他資源的時候,會自動在請求頭上添加:Cookie:JSESSIONID=客戶端第一次拿到的session ID這樣,服務器端在接到請求時候,就會收到session ID,并根據ID在內存中找到之前創建的session對象,提供給請求使用。這也是session使用的基本原理----搞不懂這個,就永遠不明白session的原理。下面是兩次請求同一個jsp,請求頭信息:通過圖可以清晰發現,第二次請求的時候,已經添加session ID的信息。3、Session刪除的時間是:1)Session超時:超時指的是連續一定時間服務器沒有收到該Session所對應客戶端的請求,并且這個時間超過了服務器設置的Session超時的最大時間。2)程序調用HttpSession.invalidate()3)服務器關閉或服務停止4、session存放在哪里:服務器端的內存中。不過session可以通過特殊的方式做持久化管理。5、session的id是從哪里來的,sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會為客戶端創建一個session,并將通過特殊算法算出一個session的ID,用來標識該session對象,當瀏覽器下次(session繼續有效時)請求別的資源的時候,瀏覽器會偷偷地將sessionID放置到請求頭中,服務器接收到請求后就得到該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,對session來說是只認id不認人。6、session會因為瀏覽器的關閉而刪除嗎?不會,session只會通過上面提到的方式去關閉。7、同一客戶端機器多次請求同一個資源,session一樣嗎?一般來說,每次請求都會新創建一個session。其實,這個也不一定的,總結下:對于多標簽的瀏覽器(比如360瀏覽器)來說,在一個瀏覽器窗口中,多個標簽同時訪問一個頁面,session是一個。對于多個瀏覽器窗口之間,同時或者相隔很短時間訪問一個頁面,session是多個的,和瀏覽器的進程有關。對于一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不同資源,session是一樣的。8、session是一個容器,可以存放會話過程中的任何對象。9、session因為請求(request對象)而產生,同一個會話中多個request共享了一session對象,可以直接從請求中獲取到session對象。10、其實,session的創建和使用總在服務端,而瀏覽器從來都沒得到過session對象。但瀏覽器可以請求Servlet(jsp也是Servlet)來獲取session的信息。客戶端瀏覽器真正緊緊拿到的是session ID,而這個對于瀏覽器操作的人來說,是不可見的,并且用戶也無需關心自己處于哪個會話過程中。---------------------------------------------------------------------------------------------------比如下面一段使用session的代碼
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{   response.setContentType("text/html");   response.setCharacterEncoding("utf-8");   PRintWriter out = response.getWriter();   // 得到用戶名和密碼,驗證   String u = request.getParameter("username");   String p = request.getParameter("password");   UserBeanBO ubb = new UserBeanBO();   if (ubb.checkUser(u, p))   {	// 1.把成功登陸的用戶所有信息放入session	UserBean ub = ubb.getUserBean(u);	request.getSession().setAttribute("userInfo", ub);	// 2.把購物車的信息取出	MyCartBO mcb = (MyCartBO)request.getSession().getAttribute("mycart");    	ArrayList al = mcb.showMyCart();	// 把al放入request	request.setAttribute("mycartInfo", al);	// 用戶合法	request.getRequestDispatcher("success.jsp").forward(request,response);  } else  {    // 用戶不合法      request.getRequestDispatcher("error.jsp").forward(request, response);		  	  }}
HttpSession  javax.servlet.http.HttpServletRequest.getSession()Returns the current session associated with this request, or if the request does not have a session, creates one.Returns: the HttpSession associated with this requestSee Also:getSession(boolean)javax.servlet.http.HttpServletRequest.getSession() 將會返回當前request相關聯的HttpSession對象,如果不存在,將會創建一個。翻譯一下,當一個瀏覽器請求來到之后,Servlet處理程序(Servlet容器內部實現)將會主動檢查請求信息Cookie當中是否有JSESSIONID,若有,找到對應JSESSION的HttpSession對象,如果沒有,創建一個,具體的機制在Servlet容器的實現當中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏边| 延川县| 车致| 泰顺县| 胶南市| 梅河口市| 金山区| 沈阳市| 贵南县| 龙海市| 定远县| 淮安市| 石河子市| 东莞市| 枞阳县| 西城区| 浙江省| 许昌县| 吴川市| 新丰县| 清涧县| 金昌市| 镶黄旗| 霍邱县| 澄迈县| 石首市| 龙海市| 谷城县| 岗巴县| 桂阳县| 延庆县| 白城市| 扎鲁特旗| 兴城市| 灵山县| 阿合奇县| 武乡县| 肥乡县| 金塔县| 怀远县| 新巴尔虎右旗|