shiro注销其他用户_Shiro实现互斥登录,并踢出登录用户功能。
作為一名小白,初遇到這種業務也著實頭疼了一段時間。經歷了各種查資料,總結出了一個相對簡便的方法。
首先在登陸之后使用
Collection list = sessionDAO.getActiveSessions();
方法獲取到所有登錄的用戶,循環該list,取到集合中單個的session對象
Subject s = new Subject.Builder().session(session).buildSubject();
獲取到subject, 然后s.isAuthenticated()判斷該subject是否通過驗證。
User user = (User) s.getPrincipal();
獲取到登錄用戶,然后判斷當前登錄用戶是否存在于已登錄用戶中,自己的user.getid 等于 循環出的user.getid的話說明用戶已經登錄了。
這時可以給session加個標識,標識已經踢出了。
這里是我寫的例子。
Collection list = sessionDAO.getActiveSessions();
String principal= (String)token.getPrincipal();
for (Session session: list) {
Subject s = new Subject.Builder().session(session).buildSubject();
if (s.isAuthenticated()) {
User user = (User) s.getPrincipal();
if(user!=null){
if (user.getCode().equals(principal)) {
if (!session.getId().equals(
getSession().getId())) {
//session.setAttribute("error", "賬號重復登錄!");
session.setAttribute("kicked", true);
}
}
}
}
}
至于為什么加標識而不是直接注銷之前登錄的用戶呢,因為這里注銷的話用戶那里莫名其妙的就自己退出了,用戶根本不知道發生了什么,所以最好建立個file提示一下再注銷。
Filter中首先先判斷kicked是否為true,不為true就直接放過吧
然后判斷是否是ajax請求
booleanisAjax=req.getHeader("X-Requested-With")!=null&& "XMLHttpRequest".equals(req.getHeader("X-Requested-With").toString());
如果不是ajax請求的話
String str = "
+ "window.top.location.href='"
+ url
+ "';";
session.setAttribute("kicked", false);
PrintWriter out = response.getWriter();
out.print(str);
out.flush();
out.close();
若是ajax請求,那么就要返回json數據啦
Map map = new HashMap();
map.put("login_status","300");
map.put("message","您的賬號在異地登錄,如非本人操作請盡快修改密碼!");
String resJSON = JSON.toJSONString(map);
out.print(resJSON);
前端js要配合一下
if(result.login_status == 300){
layer.msg(result.message);//您的賬號在異地登錄....
//?然后跳轉網頁
}
這樣既可實現互斥登錄功能。
一個很基礎很簡單的方法,在此寫下博客記錄下來,用于提醒自己,以及幫助以后會遇到這樣的問題的人。O(∩_∩)O~。。。
總結
以上是生活随笔為你收集整理的shiro注销其他用户_Shiro实现互斥登录,并踢出登录用户功能。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 获取 特定日期 6个月前的
- 下一篇: mysql 1280_技术分享 | My