安卓登入以及會話保持的解決方案

2021-09-01 11:17:15 字數 3088 閱讀 7452

登入介面很快就寫好了,登入成功後使用者資訊是快取再session當中的

/**

* 使用者登入**

if (flag ==loginresult.使用者被鎖定)

else

if (flag ==loginresult.登入失敗)

} catch

(exception e)

return

result;

}

/
但是登入成功後,再呼叫其他需要獲取登入使用者資訊的時候的時候發現在session中沒有,不對啊,明明自已用瀏覽器測試是ok的啊,我自己補不了解嘛,

技術經理也跑了,不知道怎麼回事啊、咋整,我去問安卓,他也不懂啊,我也走吧。

然後debug測試吧,用瀏覽器不這樣啊,session是同乙個吶。測試一下,在後台列印一下sessionid:

瀏覽器訪問介面:

模擬安卓訪問介面:

每次都生成了新的session,這麼搞不行啊,每次請求都生成新session,我怎麼快取你登入使用者的資訊啊。

然後就想辦法解決啊 ,想來想去想了兩個方案

方案1:自定義身份識別方式(token),類似自己模擬session

再使用者登入以後,在系統內生成乙個唯一的身份標識,並將此標識返回給客戶端。身份標識儲存15天,如果使用者,在其他終端登入,或者15天超時在伺服器沒有業務,將通知終端會話超時,重新登入。

後台**就不貼了,使用的uuid生成的乙個字串,作為使用者的登入標識,將使用者資訊寫入快取,類似key :user這種方式儲存。

使用者請求其他介面的時候,會被我的乙個***攔截,如果發現根據字串查詢使用者查詢不到,就會將使用者剔除系統。

這樣寫,犧牲掉了一部分系統效能,來實現安卓與伺服器之間的長連線,因為基本攔截了所有的介面,每次都判斷是否登入,或者登入超時。

方案2:還是使用sessionid,其實兩種方式都差不多,不過我還是推薦這種,第一種的花同一時間使用者太多,session過多,可能導致其他的問題。

web瀏覽器保持會話,是因為有session的存在,不同的伺服器在瀏覽器請求的時候會判斷是否為第一次請求,如果是第一次就回返回乙個引數set-cookie,一般瀏覽器支援自己儲存這個資料,這個資料也是瀏覽器與伺服器保持會話的標識;

再次請求相同的伺服器,瀏覽器會從cookie中取出這些這值,載入到瀏覽器的請求中去

瀏覽器如果不禁用cookie的話,瀏覽器就會將伺服器返回的資料儲存到cookie當中去,session與cookie不清楚的,去查資料吧。

安卓的訪問方式

儘管安卓可以使用許多網路框架來進行訪問,但是我不是很了解吶,加上公司的安卓開發也不甚了解,

我覺得他是使用httpclient類似的方式來進行訪問的,我就謝了乙個**模擬了下安卓的請求,來獲取下伺服器返回的資料,看能不能獲取到 set-cookie;

public class mainactivity 

}//控制台輸出

哎可以的。就讓安卓再第一次請求伺服器的時候將這個sessionid儲存下來吧,快取到手機,

然後請求後台的時候,將儲存的cookie放在httppost的請求當中,這樣訪問伺服器時,伺服器就會認為是同乙個使用者了。也就是說保持了這個會話。

其實兩種方式的原理都差不多,如果有更好的方案,也可以跟我說,學習嘛。

基於redis的單點登入解決方案

單點登入有兩種模型,一種是共同父域下的單點登入 例如網域名稱都是 xx.a.com 還有就是完全跨域下的單點登入 例如網域名稱是xx.a.com,xx.b.com 本文我們講一下完全跨域下的單點登入該怎麼實現。基於安全考慮,想通過cookie來實現這個功能是不太可能的了 也許有其他黑科技可以實現,這...

SSIS服務無法登入的解決方案

現象1 登入ssis報許可權認證失敗。授予對 integration services 服務的訪問許可權 執行 dcomcnfg.exe。dcomcnfg.exe 提供用於修改登錄檔中的某些設定的使用者介面。在 元件服務 對話方塊中,展開 元件服務 計算機 我的電腦 dcom 配置 節點。右鍵單擊m...

跨域的原因以及解決方案

字不多打,直接上 跨域是因為同源策略,同源策略是為了網頁的安全而產生的乙個約定,使不同埠 網域名稱 協議的客戶端指令碼在沒有明確授權的情況下,不能讀寫對方資源。但有時又需要不同源網頁之間進行這一系列操作,所以出現了跨域。1 通過jsonp跨域 2 document.domain iframe跨域 3...