標籤:
cookies session均為key---value的形式展示,
1. session是儲存在服務端,並有一塊地區控制項儲存使用者資訊,主要是為了判斷該使用者是否登入,在用戶端採用httpClient/HttpUrlConnection進行登入請求的時候,傳過去的username=“ccc” 服務端中的session進行判斷是否存在改sessionId,以及value,不存在代表改使用者不曾登入,伺服器會自動產生唯一的sessionId其為key,傳過來的ccc則為value,key="sessionId" value=“ccc”,成功請求後下次進行http請求的時候要求標頭會帶上這個sessionId進行跟服務端的session儲存地區進行判斷,是否登入過,登入過則返回成功,未登入則從新分配。判斷類似map集合,通過map.get(sessionId)是否等於ccc。
2. 問題:httpClient中的cookie管理看什嗎?
3. CookieManager 是管理webview的,session是儲存在cookies中,httpclient登入到伺服器的時候,從http的cookie中取出sessionId放入到webview中(同步cookie),webview訪問業務的時候,由於sessionId一致,伺服器會認為該使用者已登入。 Cooki的擷取:
1 12 23 4 CookieManager cm = CookieManager.getInstance();5 String Cookiestr = cm.getCookie(url);
Cookie的同步:
1 Cookie的同步:2 3 4 CookieSyncManager.createInstance(this);5 6 7 CookieSyncManager.getInstance().sync();
清除Cookie:
1 清除Cookie:2 3 CookieManager.getInstance().removeSessionCookie();4 或:5 CookieManager.getInstance().removeAllCookies();
只要允許js就不能同步成功。原因可能是因為允許js就能通過ajax跨域擷取資料。可能處於安全考慮所以被禁止 httpclient與webview需要進行cookie 共用,因為如果不共用,那麼假設你在httpclient進行了登入,然後用webview裡開啟那些login之後才能看的page
1 - DefaultHttpClient httpclient=....; 2 - String toUrl="https://cap.cityu.edu.hk/studentlan/details.aspx....."; 3 - 4 - List<Cookie> cookies = httpclient.getCookieStore().getCookies(); 5 - 6 - if (! cookies.isEmpty()){ 7 - CookieSyncManager.createInstance(this); 8 - CookieManager cookieManager = CookieManager.getInstance(); 9 - //sync all the cookies in the httpclient with the webview by generating cookie string10 - for (Cookie cookie : cookies){11 - String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();12 - cookieManager.setCookie(toUrl, cookieString);13 - CookieSyncManager.getInstance().sync();14 - }15 - }
1 SharedPreferences spf = getSharedPreferences("Cookie", Context.MODE_PRIVATE);2 CookieSyncManager.createInstance(this);3 CookieManager cookieManager = CookieManager.getInstance();4 String cookieString = spf.getString("cookieString", "");5 cookieManager.setCookie(url, cookieString);6 CookieSyncManager.getInstance().sync();7 8 webview.loadUrl(url);
1 public static void addLoginCookie() { 2 //登入成功後 重新設定webviewcookie資訊 用來保持session一致...................start 3 CookieSyncManager.createInstance(App.getInstance().getApplicationContext()); 4 CookieManager cookieManager = CookieManager.getInstance(); 5 6 List<Cookie> cookies = App.getPersistentCookiesList(); 7 for (int i = 0; i < cookies.size(); i++) { 8 Cookie cookie = cookies.get(i); 9 String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();10 cookieManager.setCookie(URLSet.cookiedomain, cookieString);11 }12 13 CookieSyncManager.getInstance().sync();14 //..................................................................end15 }
參考連結http://www.cnblogs.com/sharpxiajun/p/3395607.html
1.1 session的概念
在電腦專業術語裡:session是指一個終端使用者與互動系統進行通訊的時間間隔,
通常指從註冊入系統到登出系統之間所經過的時間以及如果需要的話,可能還有一定操作空間。 具體到web應用裡的session,大家都做過web開發,這裡我就先不提出web裡session的定義,先和大夥講下和session相關的技術背景。 早期的web應用或者說早期的網站都是一種處理靜態資源的網站,功能主要是查看文檔,看看圖片,而現在的web應用和早期的差別已經很大,互連網的網站更準確的定義應該是互連網軟體即網站就是軟體,網站所代表的軟體和早期軟體的定義是不一樣的,早期的軟體都是在單機環境下運行,而互連網的普及讓軟體和網路技術融合在一起,這就要求網站所代表的軟體應該要有一個對交易處理的記憶功能,交易處理的記憶功能就是我們常說的要有狀態。而實現web應用技術的核心http協議是一個無狀態的協議,http這種設計也許是曆史遺留問題,也許無狀態的http是最簡單也是最有效通訊方式,但是當網站成為軟體後,狀態的保持就是一個很重要的功能。因此在web應用開發裡就出現了保持http連結狀態的技術:一個是cookie技術,另一種是session技術。
cookie技術是用戶端的解決方案(當然隨著html5的出現,比cookie更為強勁和安全的技術出現了,但是鑒於html5的普及度不夠,就不做本文討論的內容了),Cookie就是由伺服器發給用戶端的特殊資訊,而這些資訊以文字檔的方式存放在用戶端,然後用戶端每次向伺服器發送請求的時候都會帶上這些特殊的資訊。讓我們說得更具體一些:
當使用者使用瀏覽器訪問一個支援Cookie的網站的時候,使用者會提供包括使用者名稱在內的個人資訊並且提交至伺服器;接著,伺服器在向用戶端回傳相應的超文本的同時也會發回這些個人資訊,當然這些資訊並不是存放在HTTP響應體(Response Body)中的,而是存放於HTTP回應標頭(Response Header);當用戶端瀏覽器接收到來自伺服器的響應之後,瀏覽器會將這些資訊存放在一個統一的位置,對於Windows作業系統而言,我們可以從: [系統硬碟]:\Documents and Settings\[使用者名稱]\Cookies目錄中找到儲存的Cookie;
自此,用戶端再向伺服器發送請求的時候,都會把相應的Cookie再次發回至伺服器。而這次,Cookie資訊則存放在HTTP要求標頭(Request Header)了。有了Cookie這樣的技術實現,
伺服器在接收到來自用戶端瀏覽器的請求之後,就能夠通過分析存放於要求標頭的Cookie得到用戶端特有的資訊,從而動態產生與該用戶端相對應的內容。通常,我們可以從很多網站的登入介面中看到“請記住我”這樣的選項,如果你勾選了它之後再登入,那麼在下一次訪問該網站的時候就不需要進行重複而繁瑣的登入動作了,
而這個功能就是通過Cookie實現的。
session技術則是服務端的解決方案,它是通過伺服器來保持狀態的。由於Session這個詞彙包含的語義很多,因此需要在這裡明確一下 Session的含義。首先,我們通常都會把Session翻譯成會話,因此我們可以把
用戶端瀏覽器與伺服器之間一系列互動的動作稱為一個 Session。從這個語義出發,我們會提到Session持續的時間,會提到在Session過程中進行了什麼操作等等;其次
,Session指的是伺服器端為用戶端所開闢的儲存空間,在其中儲存的資訊就是用於保持狀態。從這個語義出發,我們則會提到往Session中存放什麼內容,如何根據索引值從 Session中擷取匹配的內容等。要使用Session,第一步當然是建立Session了。那麼Session在何時建立呢?當然還是在
伺服器端程式啟動並執行過程中建立的,不同語言實現的應用程式有不同建立Session的方法,而在Java中是通過調用HttpServletRequest的getSession方法(使用true作為參數)建立的。
在建立了Session的同時,伺服器會為該Session產生唯一的Session id,而這個Session id在隨後的請求中會被用來重新獲得已經建立的Session;在Session被建立之後,就可以調用Session相關的方法往Session中增加內容了,而這些內容只會儲存在伺服器中,發到用戶端的只有Session id;當用戶端再次發送請求的時候,會將這個Session id帶上,伺服器接受到請求之後就會依據Session id找到相應的Session,從而再次使用之。正式這樣一個過程,使用者的狀態也就得以保持了。 由此我們可以得出,
session是解決http協議無狀態問題的服務端解決方案,它能讓用戶端和服務端一系列互動動作變成一個完整的事務,能使網站變成一個真正意義上的軟體。
1.2 cookie與session的關係 cookie和session的方案雖然分別屬於用戶端和服務端,但是服務端的session的實現對用戶端的cookie有依賴關係的,上面我講到
服務端執行session機制時候會產生session的id值,這個id值會發送給用戶端,用戶端每次請求都會把這個id值放到http請求的頭部發送給服務端,而這個id值在用戶端會儲存下來,儲存的容器就是cookie,因此當我們完全禁掉瀏覽器的cookie的時候,服務端的session也會不能正常使用(注意:有些資料說ASP解決這個問題,當瀏覽器的cookie被禁掉,服務端的session任然可以正常使用,ASP我沒實驗過,但是對於網路上很多用php和jsp編寫的網站,我發現禁掉cookie,網站的session都無法正常的訪問)
1.3 session實現的原理 java的web容器都實現了session機制,實現的邏輯思想都是一致的,但是具體方案可能會存在一定差異,這裡我以tomcat容器為例,探討下session實現的機制。是tomcat源碼裡session實現: 實現包的路徑是:org.apache.catalina.session,tomcat對外提供session調用的介面不在這個實現包裡,對外介面是在包javax.servlet.http下的HttpSession,而實現包裡的StandardSession是tomcat提供的標準實現,當然對外tomcat不希望使用者直接操作StandardSession,而是提供了一個StandardSessionFacade類,tomcat容器裡具體操作session的組件是servlet,而servlet操作session是通過StandardSessionFacade進行的,這樣就可以防止程式員直接操作StandardSession所帶來的安全問題。(StandardSessionFacade使用了設計模式裡的Fa?ade(外觀)模式,面板模式能讓不同邏輯層的組件進行解耦)。 實作類別裡有Manager的類是用來管理session的工具類,它負責建立和銷毀session對象,其中ManagerBase是所有session管理工具類的基類,它是一個抽象類別,所有具體實現session管理功能的類都要繼承這個類,該類有一個受保護的方法,該方法就是建立sessionId值的方法(tomcat的session的id值產生的機制是一個隨機數加時間加上jvm的id值,jvm的id值會根據伺服器的硬體資訊計算得來,因此不同jvm的id值都是唯一的),StandardManager類是tomcat容器裡預設的session管理實作類別,它會將session的資訊儲存到web容器所在伺服器的記憶體裡。PersistentManagerBase也是繼承ManagerBase類,它是所有持久化儲存session資訊的基類,PersistentManager繼承了PersistentManagerBase,但是這個類只是多了一個靜態變數和一個getName方法,目前看來意義不大,對於持久化儲存session,tomcat還提供了StoreBase的抽象類別,它是所有持久化儲存session的基類,另外tomcat還給出了檔案儲存體FileStore和資料存放區JDBCStore兩個實現。
1.4 在實際運用中session所帶來的問題 由上面所描述的session實現機制,我們會發現,為了彌補http協議的無狀態的特點,服務端會佔用一定的記憶體和cpu用來儲存和處理session計算的開銷,這也就是tomcat這個的web容器的並發串連那麼低(tomcat官方文檔裡預設的串連數是200)原因之一。因此很多java語言編寫的網站,在生產環境裡web容器之前會加一個靜態資源伺服器,例如:apache伺服器或nginx伺服器,靜態資源伺服器沒有解決http無狀態問題的功能,因此部署靜態資源的伺服器也就不會讓出記憶體或cpu計算資源專門去處理像session這樣的功能,這些記憶體和cpu資源可以更有效處理每個http請求,因此靜態資源伺服器的並發串連數更高,所以我們可以讓那些沒有狀態保持要求的請求直接在靜態伺服器裡處理,而要進行狀態保持的請求則在java的web容器裡進行處理,這樣能更好的提升網站的效率。 當下的互連網網站為了提高網站安全性和並發量,服務端的部署的伺服器的數量往往是大於或等於兩台,多台伺服器對外提供的服務是等價的,但是不同的伺服器上面肯定會有不同的web容器,由上面的講述我們知道session的實現機制都是web容器裡內部機制,這就導致一個web容器裡所產生的session的id值是不同的,因此當一個請求到了A伺服器,瀏覽器得到響應後,用戶端存下的是A伺服器上所產生的session的id,當在另一個請求分發到了B伺服器,B伺服器上的web容器是不能識別這個session的id值,更不會有這個sessionID所對應記錄下來的資訊,這個時候就需要兩個不同web容器之間進行session的同步。Tomcat容器有一個官方的解決方案就是使用apache+tomcat+mod_jk方案,當一個web容器裡session的資訊發生變化後,該web容器會向另一個web容器進行廣播,另一個web收到廣播後將session資訊同步到自己的容器裡,這個過程是十分消耗系統資源,當訪問量增加會嚴重影響到網站的效率和穩定性。 我現在所做的網站裡有一個解決方案,當使用者請求網站的時候會先將請求發送給硬體的負載平衡裝置,該裝置可以截獲用戶端發送過來的session的id值,然後我們根據這個id值找到產生這個session的伺服器,將請求直接發送給這台伺服器。這種解決方案看起來解決了session共用問題,其實結果是將叢集系統最終變回了單點系統,如果處理請求的web容器掛掉了,那麼使用者的相關會話操作也就廢掉了。此外,這種做法也幹擾了負載平衡伺服器的負載平衡的計算,讓請求的分發並不是公平的。 一般大型互聯公司的網站都是有一個個獨立的頻道所組成的,例如我們常用的百度,會有百度搜尋,百度音樂,百度百科等等,我相信他們不會把這些不同頻道都給一個Team Dev完成,應該每個頻道都是一個獨立Team Dev,因為每個頻道的應用的都是獨立的web應用,那麼就存在一個跨網站的session同步的問題,跨網站的登入可以使用單點登入的(SSO)的解決方案,但是不管什麼解決方案,跨網站的session共用任然是逃避不了的問題。 1.5 解決session相關問題的技術方案由上所述,session一共有兩個問題需要解決:1) session的儲存應該獨立於web容器,也要獨立於部署web容器的伺服器;2)如何進行高效的session同步。 在講到解決這些問題之前,我們首先要考慮下session如何儲存才是高效,是存在記憶體、檔案還是資料庫了?檔案和資料庫的儲存方式都是將session的資料固化到硬碟上,操作硬碟的方式就是IO,IO操作的效率是遠遠低於操作記憶體的資料,因此檔案和資料庫儲存方式是不可取的,所以將session資料存放區到記憶體是最佳的選擇。因此最好的解決方案就是使用分布式緩衝技術,例如:memcached和redis,將session資訊的儲存獨立出來也是解決session同步問題的方法。Tomcat的session同步也有使用memcache的解決方案,大家可以參加下面的文章: http://blog.sina.com.cn/s/blog_5376c71901017bqx.html但是該方案只是解決了同步問題,session機制任然和web容器緊耦合,我們需要一個高效、可擴充的解決方案,那麼我們就應該不是簡單的把session獨立出來儲存而是設計一個完全獨立的session機制,它既能給每個web應用提供session的功能又可以實現session同步,下面是一篇用zookeeper實現的分布式session方案:http://blog.sina.com.cn/s/blog_5376c71901017bqx.html 自己理解: 用戶端首次訪問伺服器的時候,http要求標頭是空,伺服器檢測並響應,如果是空則返回相應的session和對應的唯一sessionId,因為session是用戶端根據http協議(無狀態串連)通過session和cookies自動化佈建,下次用戶端再進行http請求的時候,要求標頭中傳入cookies,伺服器自動擷取並校正,如果是單純的瀏覽器,在校正sessionId與伺服器設定的逾時時間相比,如果逾時直接拉取登入,未逾時且一致則跳入相應的介面擷取相關資訊。 因為http是無狀態協議,而cookie的作用就是為瞭解決Http協議無狀態的缺陷。session機制則是用戶端與伺服器之間保持狀態的解決方案 參考連結:http://blog.csdn.net/axin66ok/article/details/6175522 1.cookie 是一種發送到客戶瀏覽器的文本串控制代碼,並儲存在客戶機硬碟上(設定了有效期間),可以用來在某個WEB網站會話間持久的保持資料。 2.session其實指的就是訪問者從到達某個特定首頁到離開為止的那段時間。 Session其實是利用Cookie進行資訊處理的,當使用者首先進行了請求後,服務端就在使用者瀏覽器上建立了一個Cookie,當這個Session結束時,其實就是意味著這個Cookie就到期了。註:為這個使用者建立的Cookie的名稱是aspsessionid。這個Cookie的唯一目的就是為每一個使用者提供不同的身份認證。 3.cookie和session的共同之處在於:cookie和session都是用來跟蹤瀏覽器使用者身份的會話方式。 4.cookie 和session的區別是:cookie資料儲存在用戶端,session資料儲存在伺服器端。 簡單的說,當你登入一個網站的時候:
· 如果web伺服器端使用的是session,那麼所有的資料都儲存在伺服器上,用戶端每次請求伺服器的時候會發送當前會話的sessionid,伺服器根據當前sessionid判斷相應的使用者資料標誌,以確定使用者是否登入或具有某種許可權。由於資料是儲存在伺服器上面,所以你不能偽造,但是如果你能夠擷取某個登入使用者的 sessionid,用特殊的瀏覽器偽造該使用者的請求也是能夠成功的。sessionid是伺服器和用戶端連結時候隨機分配的,一般來說是不會有重複,但如果有大量的並發請求,也不是沒有重複的可能性.
· 如果瀏覽器使用的是cookie,那麼所有的資料都儲存在瀏覽器端,比如你登入以後,伺服器設定了cookie使用者名稱,那麼當你再次請求伺服器的時候,瀏覽器會將使用者名稱一塊發送給伺服器,這些變數有一定的特殊標記。伺服器會解釋為cookie變數,所以只要不關閉瀏覽器,那麼cookie變數一直是有效,所以能夠保證長時間不掉線。如果你能夠截獲某個使用者的 cookie變數,然後偽造一個資料包發送過去,那麼伺服器還是認為你是合法的。所以,使用 cookie被攻擊的可能性比較大。如果設定了的有效時間,那麼它會將 cookie儲存在用戶端的硬碟上,下次再訪問該網站的時候,瀏覽器先檢查有沒有 cookie,如果有的話,就讀取該 cookie,然後發送給伺服器。如果你在機器上面儲存了某個論壇 cookie,有效期間是一年,如果有人入侵你的機器,將你的 cookie拷走,然後放在他的瀏覽器的目錄下面,那麼他登入該網站的時候就是用你的的身份登入的。所以 cookie是可以偽造的。當然,偽造的時候需要主意,直接copy cookie檔案到 cookie目錄,瀏覽器是不認的,他有一個index.dat檔案,儲存了 cookie檔案的建立時間,以及是否有修改,所以你必須先要有該網站的 cookie檔案,並且要從保證時間上騙過瀏覽器
5.兩個都可以用來存私密的東西,同樣也都有有效期間的說法,區別在於session是放在伺服器上的,到期與否取決於服務期的設定,cookie是存在用戶端的,過去與否可以在cookie產生的時候設定進去。
(1)cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上
(2)cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,如果主要考慮到安全應當使用session
(3)session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,如果主要考慮到減輕伺服器效能方面,應當使用COOKIE
(4)單個cookie在用戶端的限制是3K,就是說一個網站在用戶端存放的COOKIE不能3K。(5)所以:將登陸資訊等重要訊息存放為SESSION;其他資訊如果需要保留,可以放在COOKIE中
webview HttpClient 怎麼保持會話session統一