用戶端(ios和android)與伺服器之間的會話管理(session和cookie)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.