標籤:cookie session 用戶端和伺服器 瀏覽器和伺服器 會話管理
項目前提:
Client Access Server介面需要攜帶根據username和password產生的access_token,
即訪問所有(除擷取access_token的介面)都要攜帶access_token,
伺服器端通過攔截器判斷使用者access_token是否失效等.
應用情境:
1.瀏覽器訪問伺服器擷取access_token介面,通過username和password擷取access_token.
2.伺服器根據username和password產生access_token,並將access_token放到session中並返回,如下:
HttpSession httpSession = request.getSession(true);
httpSession.setAttribute("access_token", accessToken);
3.瀏覽器訪問所有介面(除擷取access_token的介面)時都攜帶access_token,伺服器端作如下對比:
HttpSession httpSession = request.getSession(true);
String reqeustAccessToken = request.getParameter("access_token");
String sessionAccessToken = (String)httpSession.getAttribute("access_token");
if(reqeustAccessToken != null && reqeustAccessToken.equals(sessionAccessToken)) {
//如果相等,說明access_token是有效.
}
測試結果:
1.開啟瀏覽器,通過chrome的rest類比外掛程式,調用伺服器擷取access_token的介面,
通過username和password擷取access_token.
2.攜帶access_token訪問其他服務介面,沒有問題,可以正常擷取資料.
3.關閉瀏覽器重新攜帶剛才擷取的access_token訪問擷取資料的介面,提示access_token失效.
通過如上測試,說明是沒有問題的.
發現問題:
通過網頁的形式訪問是沒有問題的,如上,其實可以理解為,開啟瀏覽器,其實就是開啟了一個會話,
關閉瀏覽器,即關閉了會話.
問題是:用戶端,即ios和android每次提供者就相當於開啟了一個會話,所以單純通過上面的機制
是有問題的,即攜帶剛剛擷取的access_token訪問其他服務介面時,列印sessionAccessToken為空白.
解決方案:
解決方案是:引入cookie機制?即用戶端必須支援cookie,每次都將訪問服務介面返回的cookie存起來,
下次提供者時都攜帶上次的cookie,這樣問題就解決了.
問題:伺服器中只是對session進行瞭解析,如下:
HttpSession httpSession = request.getSession(true);
String reqeustAccessToken = request.getParameter("access_token");
String sessionAccessToken = (String)httpSession.getAttribute("access_token");
if(reqeustAccessToken != null && reqeustAccessToken.equals(sessionAccessToken)) {
//如果相等,說明access_token是有效.
}
並沒有對cookie做任何解析,伺服器是自動完成工作的?
工作原理:
1.Client Access Server擷取access_token介面,通過username和password擷取access_token.
2.伺服器根據username和password產生access_token,並將access_token放到session中並返回,如下:
HttpSession httpSession = request.getSession(true);
httpSession.setAttribute("access_token", accessToken);
注意:session的管理機制可以理解為一個集合,這個集合存放在記憶體中.
3.用戶端擷取access_token後,將伺服器返回的cookie添加到本地,注意:cookie中存放的是session資訊.
4.用戶端再次攜帶access_token訪問伺服器介面,同時攜帶上cookie資訊.
5.伺服器端再執行HttpSession httpSession = request.getSession(true);時,伺服器會自動讀取cookie資訊,
擷取cookie中session資訊,再根據session資訊,從session集合中擷取對應的session,然後再從session中擷取
sessionAccessToken,最後做比較,判斷access_token是否有效.
用戶端(ios和android)與伺服器之間的會話管理(session和cookie)