最近做新的web應用, 要求可以用其他系統的賬號登入,如老系統的單點登入,第三方平台登入情況,於是我從新梳理一下從最簡單伺服器登入到複雜的情況:
1 原始伺服器自動做的
瀏覽器第一次請求時,伺服器端建立session,並把sessionid發給客戶端存放在cookie中id為jssseionid。
瀏覽器第二次請求時,伺服器獲取客戶端的cookie中的jsessionid,根據jsessionid找到session物件。
2 登入系統方案
2.1 登入:,需要過濾所有請求,判斷是否登入過, 登入則可以通過,否則返回登入頁。
2.2 在過濾器中,每次請求時,都獲取session(request.getsession()),如果是第一次請求,此時session為新建的session,判斷session中的使用者資訊是否存在(session.getattrbute(「user」),登入時存放使用者資訊。)。如果不存在,則跳轉到登入頁面。
2.3 使用者登入頁面確認登入的請求到伺服器時(此時使用者身份驗證過濾器不過濾該請求),驗證使用者資訊,然後獲取使用者資訊並將其存放到session(session.setattbute(「user」))中,之後跳轉頁面返回客戶端。此時完成登入。
2.4 再次請求時。同樣獲取session,判斷session中的使用者資訊是否存在(session.getattrbute(「user」),因為已經登入過,所以此時的user資訊存在,則可以繼續訪問。
總結:單台伺服器的登入,只需要在session中記錄使用者的資訊,再次請求時,判斷session中資訊是否存在來判斷是否登入過即可。不需要在自己往客戶端寫cookie。
集群伺服器登入跟單台的登入類似,不同之處是:客戶端登入一台機器後,之後的請求可能被分配到其他的機器中,如果其他機器沒有相關處理,則在其他機器上找不到登入資訊會跳轉到登入頁。處理方式一般有兩種情況:1、集群機器之間session同步。2、不同機器每次過濾請求時,沒有登入的讓其自動登入,這種情況需要乙個登入資訊記錄在客戶端中用於表明使用者身份。
第一種處理方式在每個集群中的節點上都保持session,會占用一定資源,一般採用第二種處理方式,第二種方式主要做的就是記錄登入資訊到客戶端,登入資訊一般包括登入使用者、登入時間(用於有效時間限制)、登入客戶端ip,然後進行加密處理。在伺服器中過濾請求時,如果判斷session中登入資訊不存在,則從cookie中去登入資訊加密字串。如果有字串則進行解密,安全校驗,通過後將使用者資訊記錄在session中,完成自動登入功能。
總結:需要將登入資訊寫到客戶端cookie中,登入資訊加密解密在每個集群中的節點中,加密可以用兩個混淆值,乙個系統的混淆值,和乙個客戶端沒有的使用者資訊可變值做混淆值。
單點登入和集群登入類似,不同之處在於登入資訊的生成和校驗是在sso伺服器中來做的,
使用者登入時請求sso伺服器,sso校驗使用者資訊通過後生產登入資訊,然後sso將登入資訊寫到客戶端cookie中,客戶端在請求應用伺服器時,伺服器判斷session中沒有登入資訊後獲取cookie中的使用者資訊字串,並請求sso伺服器驗證該字串是否正確,如果正確並返回使用者資訊,應用伺服器將使用者資訊放到session中。
總結:使用者登入資訊的生產和驗證都要sso伺服器來做。應用伺服器呼叫即可。
第三方登入與單點登入類似,其實第三方就相當於乙個sso伺服器。
Web應用亂碼 1 解決方案
1.修改tomcat的配置檔案 把tomcat中所有的標籤的uriencoding屬性進行設定 2.通過filter過濾器,在請求到達servlet前,對請求進行處理,指定請求的編碼格式。核心 1.初始化編碼格式 public void init filterconfig filterconfig ...
適應不同移動端web頁面解決方案
同乙個html在不同的移動裝置上顯示效果也有不同.在剛開始開發移動端的時候,經常遇到不同裝置頁面錯位的問題.網上也有好多種解決方案.這裡介紹其中一種解決方案.說方案之前首先得解釋一下單位 px,em,rem,vw px畫素 相對長度單位。畫素px是相對於顯示器螢幕解析度而言的.比如說解析度是1366...
登入方案 使用者單點登入
在微服務專案中,由於使用者往往需要通過閘道器訪問多個微服務,如登入需要訪問使用者微服務,商品瀏覽需要訪問商品微服務,下單需要訪問訂單微服務,支付需要訪問支付微服務。但如何防止使用者操作其他使用者的資料,這就需要在各個微服務中增加授權認證。每個服務都要認證使用者的身份,身份認證成功後,需要識別使用者的...