Cookie->Session->Token的發展旅程(一)

前言

JAVA WEB項目可分爲無狀態與有狀態。一個商城,用戶添加購物車或者下訂單這種操作,都是有狀態的,服務器爲了區分不同用戶的操作,需要記錄一些特殊的信息。當用戶再次訪問時,攜帶這些信息,服務器就可以區分出用戶做了哪些操作。從最早的Cookie到後來的Session,再到後來的Token,本文帶你瞭解這段發展旅程。

Cookie概念

你有沒有碰到過這種情形,之前在搜索引擎搜索過一些商品,之後連着幾天都會有各種廣告推送相關的商品。這是因爲之前瀏覽網頁的時候,服務器發送了一些信息記錄在你的計算機上,下次再次光臨網站時,服務器會先看看請求中有沒有這些信息,有的話就會推送特定的網頁內容。上面提到的信息就是Cookie。

Cookie是由服務器生成,發送給瀏覽器,瀏覽器會將Cookie中的key/value保存到某個目錄下的文件中。下次訪問時攜帶Cookie發送到服務器。

Cookie的屬性主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用範圍。

1)Name 和 Value 屬性由程序設定,默認值都是空引用。

2)Domain屬性的默認值爲當前URL的域名部分,不管發出這個cookie的頁面在哪個目錄下的。

3)Path屬性的默認值是根目錄,即 ”/” ,不管發出這個cookie的頁面在哪個目錄下的。可以由程序設置爲一定的路徑來進一步限制此cookie的作用範圍。

4)Comment屬性,註釋。

5)version屬性。

6)maximum age:屬性,單位是秒如果是0,說明要刪除。

public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        Cookie cookie=new Cookie("name","Tom");        //設置Maximum Age        cookie.setMaxAge(1000);        //設置cookie路徑爲當前項目路徑        cookie.setPath(request.getContextPath());        //添加cookie        response.addCookie(cookie);    }
public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        PrintWriter out=response.getWriter();        Cookie[] cookies=request.getCookies();        if(cookies!=null){            for(Cookie cookie:cookies){                String name=cookie.getName();                String value=cookie.getValue();                out.write(name+"="+value);            }        }    }

 

Session

Cookie保存在瀏覽器中,所以有可能被篡改。保存在服務器上的Session應運而生。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

每個用戶訪問服務器都會建立一個session,那服務器是怎麼標識用戶的唯一身份呢?事實上,用戶與服務器建立連接的同時,服務器會自動爲其分配一個SessionId。

HttpSession session = request.getSession();List<Book> list = (List) session.getAttribute("list");
 HttpSession session = request.getSession();         //將數據存儲到session中         session.setAttribute("data", "孤傲蒼狼");         //獲取session的Id         String sessionId = session.getId();         //判斷session是不是新創建的         if (session.isNew()) {             response.getWriter().print("session創建成功,session的id是:"+sessionId);         }else {             response.getWriter().print("服務器已經存在該session了,session的id是:"+sessionId);         }

  

session產生一個sessionId,可以由瀏覽器的Cookie保存。 如果客戶端禁用了cookie,通常有兩種方法實現session而不依賴cookie。

1)URL重寫,就是把sessionId直接附加在URL路徑的後面。

2)表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞迴服務器。比如: 

<form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form> 

Session共享:

對於多網站(同一父域不同子域)單服務器,我們需要解決的就是來自不同網站之間SessionId的共享。由於域名不同(aaa.test.com和bbb.test.com),而SessionId又分別儲存在各自的cookie中,因此服務器會認爲對於兩個子站的訪問,是來自不同的會話。解決的方法是通過修改cookies的域名爲父域名達到cookie共享的目的,從而實現SessionId的共享。帶來的弊端就是,子站間的cookie信息也同時被共享了。  

總結

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

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

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

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

5、可以考慮將登陸信息等重要信息存放爲session,其他信息如果需要保留,可以放在cookie中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章