標籤:
session在電腦中,尤其是在網路應用中,稱為“會話控制”。session Object Storage Service特定使用者會話所需的屬性及配置資訊。session跟蹤是Web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術是cookie與session。Cookie通過在用戶端記錄資訊確定使用者身份,session通過在伺服器端記錄資訊確定使用者身份。今天這篇博文,小編主要簡單的介紹一下session和cookie,還請各位大神多多指教。
session的基本原理
小夥伴們都知道cookie是存在用戶端的,session是存到服務端的,如果存到session整個空間裡,只要這個使用者沒有關閉瀏覽器,都能從伺服器上取得設定的值,如果重新啟動瀏覽器就沒有了,seesion是一個會話,一個會話可以看作是一個人,那麼她就和這個人進行了綁定,對應這個瀏覽器,所以人和瀏覽器就進行了綁定,如:
結合上面的圖形,小編來詳細的介紹一下,假如張三是一個人,且張三是一個用戶端,張三要訪問我們的伺服器(目前我們使用的伺服器是tomcat),當張三來訪問的時候,我們在tomcat上開闢一個資源或者說開闢一個空間給張三,更準確的說,就是分配一塊記憶體給張三,ok,這個時候,張三就可以進行訪問了,張三可以向記憶體裡面存入資源,只要瀏覽器沒有進行關閉的操作,這裡面的資源張三可以隨時進行存的操作,不管訪問了多少頁面,只要以前存放在這個瀏覽器裡面的資源,張三都可以拿出來,但是如果進行了關閉瀏覽器的操作,那麼這個裡面的東西張三就拿不出來了,再次開啟瀏覽器,用張三進行登入,也是取不出來的,所以這塊的內容佔著記憶體。那麼如果這個時候李四來了,李四也開闢了一個空間,李四把瀏覽器關閉了,同樣的,李四這塊也佔用了一定的記憶體,講解到這裡,小編相信,小夥伴們都能理解了,seesion實在服務端的,在tomcat上,cookie是在用戶端的,我們在深入一點研究,http這個協議,小夥伴都有所瞭解,比如我們平常使用的通訊工具QQ,她可以檢測到對方在不線上,比如張三發了一個訊息給李四,李四回複了張三的訊息,那麼問題來了,張三是如何找到李四的呢?張三肯定要知道李四的地址,這樣張三和李四才能相互找到對方,而http協議又是怎麼回事呢?還是上面的例子來說,假設張三去訪問,訪問tomcat,tomcat為其開闢了一個空間,之後response進行返回,那下一次訪問的時候,張三如何知道他需要找的地方呢?而不是找其他的地方呢?因為這裡面有很多的空間,假設有一萬個使用者,就有一萬份記憶體的分配,怎麼樣才能知道訪問的地方是分配給張三的那塊記憶體呢?是否可以用張三進行標記一下?如果有重複的呢?我們又該怎麼辦?所以http協議是沒有狀態的,她不會一直處於串連的狀態,如果一直處於串連的狀態,張三肯定能找到分配給自己的那塊記憶體,這個request過來,再response過去,就斷了,她串連完之後,馬上就斷,也就是誰都不知道誰的存在了,不像QQ,如果一方下線了,另一方馬上知道對方已經不線上了,所以http是無狀態的,現在誰都不認識誰了,下次如果再想找這塊資源,就找不到,那麼我們該怎麼辦呢?且聽小編慢慢道來:
假設張三來進行訪問的操作,伺服器上為張三分配了一個空間,這個空間屬於張三,整個會話都可以用到,所以她叫做session,如果把瀏覽器關閉,再次啟動進行訪問的時候,那麼就是另外一個會話了,不是這一次的了,當張三來訪問的時候,就會建立一個seesionid,所有會有一個標識,這個seesionid是不重複的,建立完編號,做完相關的操作之後,response返回,會把編號也一同帶回去,假如這個時候,李四來了,也會為李四建立一個id,訪問完成之後,同樣會把編號帶回去,如所示:
所以session有一個逾時的概念,如果沒有訪問,就會被釋放。在cookie裡面儲存了session的id。cookie是可以禁用的,如果瀏覽器不讓我們寫cookie了,那怎麼辦呢,seesion也找不到了,如何解決了,這個時候,我們採用URL重寫的方式,什麼叫url重寫呢?URL重寫就是首先獲得一個進入的URL請求然後把它重新寫成網站可以處理的另一個URL的過程。舉個例子來說,如果通過瀏覽器進來的URL是“UserProfile.aspx?ID=1”那麼它可以被重寫成 “UserProfile/1.aspx”,這樣的URL,這樣的網址可以更好的被網站所閱讀。如果瀏覽器不支援Cookie或使用者阻止了所有Cookie,可以把會話ID附加在HTML頁面中所有的URL上,這些頁面作為響應發送給客戶。這樣,當使用者單擊URL時,會話ID被自動作為請求行的一部分而不是作為頭行發送回伺服器。這種方法稱為URL重寫(URL rewriting)。
URL重寫
URL重寫就是首先獲得一個進入的URL請求然後把它重新寫成網站可以處理的另一個URL的過程。舉個例子來說,如果通過瀏覽器進來的URL是“UserProfile.aspx?ID=1”那麼它可以被重寫成 “UserProfile/1.aspx”,這樣的URL,這樣的網址可以更好的被網站所閱讀。
如果瀏覽器不支援Cookie或使用者阻止了所有Cookie,可以把會話ID附加在HTML頁面中所有的URL上,這些頁面作為響應發送給客戶。這樣,當使用者單擊URL時,會話ID被自動作為請求行的一部分而不是作為頭行發送回伺服器。這種方法稱為URL重寫(URL rewriting)。
一般來說,URL重寫是支援會話的非常健壯的方法。在不能確定瀏覽器是否支援Cookie的情況下應該使用這種方法。然而,使用URL重寫應該注意下面幾點:
1.如果使用URL重寫,應該在應用程式的所有頁面中,對所有的URL編碼,包括所有的超連結和表單的action屬性值。
2.應用程式的所有的頁面都應該是動態。因為不同的使用者具有不同的會話ID,因此在靜態HTML頁面中無法在URL上附加會話ID。
3.所有靜態HTML頁面必須通過Servlet運行,在它將頁面發送給客戶時會重寫URL。
url重寫有什麼缺點呢?對所有的URL使用URL重寫,包括超連結,form的action,和重新導向的URL。每個引用你的網站的URL,以及那些返回給使用者的URL(即使通過間接手段,比如伺服器重新導向中的Location欄位)都要添加額外的資訊。這意味著在你的網站上不能有任何靜態HTML頁面(至少靜態頁面中不能有任何連結到網站動態網頁面的連結)。因此,每個頁面都必須使用servlet或JSP動態產生。即使所有的頁面都動態產生,如果使用者離開了會話並通過書籤或連結再次回來,會話的資訊都會丟失,因為儲存下來的連結含有錯誤的標識資訊-該URL後面的SESSION ID已經到期了。介紹完了session,小編再來簡單的介紹一下cookie。
cookie的基本原理
cookie在英文中的意思指的是就這牛奶一起吃的點心,然而,在網際網路內,cookie這個字有了完全不同的意思,那麼cookie到底是什麼呢,cookie是小量資訊,由網路伺服器發送出來以儲存在網路瀏覽器上,從而下次這位獨一無二的訪客又回到該網路伺服器時,可從該瀏覽器讀回此資訊,這是很有用的,讓瀏覽器記住這位訪客的特定資訊,這是很有用的,讓瀏覽器記住這位訪客的特定資訊,如上次訪問的位置,花費的時間或使用者喜好設定如樣式表,cookie是個儲存在瀏覽器目錄的文字檔,當瀏覽器運行時,儲存在ram中,一旦從該網站或網路伺服器退出,cookie也可儲存在電腦的硬驅上,當訪客結束其瀏覽器對話時,即終止的所有所有cookie。
簡單來說,cookie的含義是伺服器發送給瀏覽器的甜點,即伺服器在響應請求時可以將一些資料以“鍵-值”對的形式通過響應資訊儲存在用戶端,當瀏覽器再次訪問相同的應用時,會將原先的cookie通過請求資訊帶到服務端,如下面的代碼,servlet展示了cookie的功能:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String option = request.getParameter("option"); if ("show".equals(option)) { //獲得請求資訊中的Cookie資料 Cookie[] cookies = request.getCookies(); if (cookies != null) { //找出名稱(鍵)為“cool”的Cookie for (int i = 0; i < cookies.length; i++) { if ("cool".equals(cookies[i].getName())) { out.println("<h2>" + cookies[i].getName() + ":" + cookies[i].getValue() + "</h2>"); } } } } else if ("add".equals(option)) { //建立Cookie對象 Cookie cookie = new Cookie("cool", "yeah!"); //設定生命週期以秒為單位 cookie.setMaxAge(20); //添加Cookie response.addCookie(cookie); } cookie可以用於保持使用者的工作階段狀態,但是cookie資訊儲存在用戶端,存在較大的安全隱患,且一般瀏覽器對cookie的數目及其資料大小有嚴格的限制,在web應用中,一般情況下通過httpSession對象保持工作階段狀態,每個cookie都可以設定一個最大生命週期,如果設定了該值,瀏覽器將會把該cookie寫到硬碟上,但如果沒有設定cookie的最大生命週期,這樣的cookie成為會話cookie,她存在記憶體中,當瀏覽器關閉時,該cookie將會消失。
cookie和session的區別
a、cookie資料存放在客戶的瀏覽器上,session資料存放在伺服器上。
b、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用seesion。
c、session會在一定時間內儲存在伺服器上,當訪問增多,會比較佔用伺服器的效能。
d、單個cookie在用戶端的限制是3k,就是說一個網站在用戶端存放的cookie不能大於3k。
小編寄語:該博文,小編主要簡單的介紹了seesion和cookie、url重寫以及session和cookie他們之間的區別。小編介紹的都是一些簡單的理論知識,對於session和cookie的具體作用,還需要我們在實際項目中多多的體會。java學習,未完待續......
深入淺出seesion和cookie