有這樣乙個需求,兩地同時使用乙個賬號登入,需要將先登入的使用者的session刪除使用者登入時判斷是否之前改賬號在別的地方登入
若沒有登入,直接進行登入
若有登入,則找到登入的session,給該session做個標記
當之前登入的使用者再次進行操作時,判斷其是否有標記,有則刪除其session,並返回友好提示
/**
* 自定義realm,用於使用者登入的驗證和授權
*/public class myrealm extends authorizingrealm catch (exception e)
return info;
} /**
* 使用者認證方法,在呼叫login方法後,呼叫該方法
*/@override
protected authenticationinfo dogetauthenticationinfo(authenticationtoken token) throws authenticationexception catch (exception e)
if (user == null)
if (user.getisdisable() == 2)
authenticationinfo info = new ******authenticationinfo(user.getusername(), user.getpassword(),
bytesource.util.bytes(user.getsalt()), getname());
// 放到shiro的session中
setsession(loginstring.login_key, user,user.getusername());是乙個常量值,隨意定義即可
return info;
} @override
public void clearcachedauthorizationinfo(principalcollection principals)
@override
public void clearcachedauthenticationinfo(principalcollection principals)
@override
public void clearcache(principalcollection principals)
public void clearallcachedauthorizationinfo()
public void clearallcachedauthenticationinfo()
public void clearallcache()
/*** 初始化shiro的加密方式
*/public void initcredentialsmatcher()
/*** 將特殊資料放入到shiro的session中,讓shiro來進行管理
* * @param key
* @param value
*/private void setsession(object key, object value,string username)
/*** 控制同一使用者只能在乙個地方登入,後登入的使用者會頂掉開始登入的使用者
* 注意:如果使用者量過大時此方法會有效率問題,需要改進
*/for(session oldsession:sessions)}}
} }}
系統的所有返回均為同一實體,將介面的資料放入實體的屬性中即可,這樣方便與前台的對接,參考**如下,這樣返回時可以根據當前的session判斷是否已經被人擠掉了。
package com.neusoft.sensteer.fleet.common.consts;
import org.apache.shiro.securityutils;
import org.apache.shiro.session.session;
/** * 介面返回的封裝物件
*/public class returnbean
public returnbean(t userdata)
public returnbean(string code, string remark)
public returnbean(t exception,string remark)
private void handlesession()}}
public string getcode()
public void setcode(string code)
public string getmessage()
public void setmessage(string message)
public t getuserdata()
public void setuserdata(t userdata)
}
這是一種暴力的獲取方式,若系統使用者量小可以考慮,若百萬千萬級別,還是建議選擇其他方式
/**
* 將特殊資料放入到shiro的session中,讓shiro來進行管理
* * @param key
* @param value
*/private void setsession(object key, object value,string username)
/*** 控制同一使用者只能在乙個地方登入,後登入的使用者會頂掉開始登入的使用者
* 注意:如果使用者量過大時此方法會有效率問題,需要改進
*/for(session oldsession:sessions)}}
} }
shiro單使用者登入實現
1.需求 賬號同一時間只能在一處登入 將之前的使用者踢出 shiro實現策略 獲取當前使用者session列表,直接刪除該使用者的其他登入資訊import org.apache.shiro.session.mgt.eis.sessiondao autowired private sessiondao...
單使用者登入
目的 乙個賬號只能在乙個地方登入,不能同時登入 有兩種處理邏輯 1.a登入後,b不能使用同樣的賬戶進行登入 後台邏輯定義 使用者資料表多新增乙個字段,預設為false,每次使用者發起登入,檢測是否為false,是則可以登入,並設定為true,如果為true,則提示使用者已登入,請換個賬號 2.a登入...
簡單使用者登入系統
view1 1.登入 2.註冊 3.退出 islogin false users 加密def code pwd li pwd list pwd li pwd2 li pwd 1 code pwd for i in range len pwd return code pwd 登入def login i...