javaweb实现单点登录,防止重复登录,获取sessionid,对session及时销毁回收,只允许一个用户登录,结合struts2实现
首先我們目的是實現一個單點登錄,即只允許單個賬戶單個登錄。
實現異地與同地登錄判斷
要將先登錄的用戶強制下線。不免用到session。
單點登錄的最大難題:已經登錄且重復登錄的用戶的session怎么web全局操作它
我們來解決它。
基本目的實現的方法之一是{
1.建立一個可以全局存儲當前登錄人員信息的Map;推薦hashmap,因為更快。
2.建立一個登錄人員監聽,}
怎么建立全局呢,還記得jsp的內置對象application嗎,對,就是用它。
使用session的getservetContext()可以得到
它是存在于整個web項目的,只有項目關閉時才會實現,做全局很合適
具體代碼在最后
存儲哪些屬性呢:
1.每個用戶的賬戶(最好必須是唯一標識),當做Map的key;
2.每個用戶產生的session的id,好吧,可以直接存session對象的,我試過,可以當做Map的value。
那么存session對象的好處是什么?你不用拿著session的id去找回session(這步超級麻煩,然而好像網上依舊有許多這樣的教程)
就可以直接對已經登錄的重復的session進行操作,過程僅僅需要一個強制轉化, 直接解決了單點登錄的最大問題:已經登錄且重復登錄的用戶的session直接可操作
那么又來了,直接存session沒有缺點嗎,不可能,你想一個session有可能存著許多的變量,那么這個對象就會變得比較大,如果項目上了級別,耗費資源也是要考慮的
好現在是具體的代碼,兩部分
1
這是在登錄驗證的時候的代碼,取其精華!強制轉換,重復的session獲取
即在登錄時檢查重復登錄,當前在線人數及其會話,加入到全局Map。
2.session的監聽器,實現SessionListener,session登錄失效去全局Map中刪除
package servlet.listener;import java.util.Map;import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent;@WebListener() public class LoginListener implements javax.servlet.http.HttpSessionListener { /*** @author joker* * * 登出,map的session刪除*/public void sessionCreated(HttpSessionEvent se) {// TODO 自動生成的方法存根}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// TODO 自動生成的方法存根HttpSession s = se.getSession();// 保存到整個web中//登出if (s.getAttribute("user") != null) {@SuppressWarnings("unchecked")Map<String, HttpSession> login_map_session = (Map<String, HttpSession>) s.getServletContext().getAttribute("login_map_session");login_map_session.remove(s.getAttribute("user"));s.getServletContext().setAttribute("login_map_session", login_map_session);} } }再加一點自己的前端,爽歪歪
總結
以上是生活随笔為你收集整理的javaweb实现单点登录,防止重复登录,获取sessionid,对session及时销毁回收,只允许一个用户登录,结合struts2实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaweb认识在web应用中重要的轮
- 下一篇: 超全流程-idea对springboot