眾所周知,做過Web開發的小伙伴可能知道,在瀏覽器向服務器發一個請求,服務器端會為當前的訪問者創建一個session會話,隨着瀏覽器的關閉而會話結束。但是移動客戶端咋整呢(IOS/Android啥的)。鄙人研究了一番,發現IOS/Android用原生接口發請求最大滴特點是每一次建一個會話,這樣登錄功能也就基本廢了。登錄功能的意義是將用戶身份驗證成功的信息存儲在session里,結果每一次請求一個新的session這可不OK啊。
那么如何保證客戶端的登錄時創建的session在后續的接口請求中都能夠行之有效的為客戶端提供會話的操作,比如用戶信息實體的存放,用戶權限功能菜單的存放啥的。首先來科普一個概念:Cookies,不懂的自己百度,還有一個比較流行的移動端開發概念access_token,做過微信開發的應該都懂,不懂自己百度。
瀏覽器的工作原理也是基於cookies,這也就能解釋每一次為何清空cookie后網站需要重新登錄。瀏覽器訪問服務端時,服務端在響應信息里包含了cookie信息,這個cookie里就有sessionId,這個sessionId會被瀏覽器自己緩存在本地cookie里,后續訪問該網站的一切請求時都會自動在HTTP請求頭Header里帶着cookie信息。因此,服務器通過cookie里的sessionId來判斷當前訪問者的身份,並且從會話集合里匹配當前sessionId所對應的會話對象。
再說說另外一個概念access_token令牌,這個是自己約定的,根據開發需要。比如有這樣的一個場景:用戶登錄請求,用戶登錄時,會帶着用戶名name和密碼pwd來訪問登錄接口。如果服務端確認該用戶是合法的,那么咱們應該由服務端生成一個access_token,保存在服務端的session會話里,並且將這個access_token返回給客戶端。
OK,到這里,客戶端總共獲取到了兩個東西,包含有sessionId的cookie和access_token,有了這兩個東西,客戶端后續在請求服務端的任何一個接口時,需帶着access_token和Cookie即可。服務端會通過cookie識別你屬於哪個session,通過access_token判斷你是否合法,此次登錄是否過期(服務端說了算)。上代碼:
////////////////////////////////////////////////////////// //一.登錄時創建會話且返回access_token到客戶端 ///////////////////////////////////////////////////////// //access_token令牌作為登錄狀態標識 HttpServletRequest req = Mvcs.getReq(); HttpSession session = req.getSession(true);//創建會話 //uuid作為token String access_token = UUID.randomUUID().toString(); session.setAttribute("access_token", access_token); //out.print("access_token:"+access_token); ////////////////////////////////////////////////////////// //二.后續的接口訪問中服務端過濾鏈邏輯 ///////////////////////////////////////////////////////// HttpServletRequest request = Mvcs.getReq(); HttpSession httpSession = request.getSession(true); String rat= request.getParameter("access_token"); String sat= (String)httpSession.getAttribute("access_token"); if(rat!= null && rat.equals(sat)) { //如果相等,說明access_token是有效的. //放行。。。 }
備注:只要你在HTTP請求頭里提交了形如:Cookie:JSESSIONID=16E11471753944CF4F68A9F665E9B97F 鍵值對,服務器會自動根據cookie里包含的sessionId去在服務端匹配屬於這個id的session並提供服務。