日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

javaweb实现单点登录,防止重复登录,获取sessionid,对session及时销毁回收,只允许一个用户登录,结合struts2实现

發布時間:2024/4/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

private void query(String sql) {try {Connection co = Jdbc_DBCP_xiu.getConnection();PreparedStatement p = co.prepareStatement(sql);ResultSet result = p.executeQuery();// 設置登錄結果if (result.next()) {ActionContext.getContext().getSession().put("user", u);this.loginflag = true;// 獲取sessionHttpSession session = ServletActionContext.getRequest().getSession(true);// 檢查重復登錄key_user value_sessionServletContext application = session.getServletContext();@SuppressWarnings("unchecked")Map<String, HttpSession> login_map_session = (Map<String, HttpSession>) application.getAttribute("login_map_session");// hashmap查找更快if (login_map_session == null) {login_map_session = new HashMap<>();}for (String key : login_map_session.keySet()) {// 同時在線if (u.equals(key)) {// 可嘗試,發送信息給未下線的另一用戶或強制下線另一用戶HttpSession otherSession=((HttpSession) (login_map_session.get(key)));// 另一用戶(HttpSession) login_map_session.get(key)//登錄失敗this.loginflag = false;if (session.getId().equals(otherSession.getId())) {session.setAttribute("tiplogin", "該用戶同一地方多次登錄!其已被強制下線");//強制本地(同一瀏覽器)所有重復會話直接下線(一個不留)//這三句相當于刪除了sessionlogin_map_session.remove(session.getAttribute("user"));session.removeAttribute("user");session.getServletContext().setAttribute("login_map_session", login_map_session);//實際不下線,留下誰都行} else {session.setAttribute("tiplogin", "該用戶已經在其他地方登錄!其已被強制下線");//強制異地(不一瀏覽器)重復會話直接下線otherSession.invalidate();}return;}}// 當前在線人數及其會話,加入到全局login_map_session.put(u, session);application.setAttribute("login_map_session", login_map_session);// 當前預備下線} else {this.loginflag = false;}Jdbc_DBCP_xiu.release(co, p, result);} catch (Exception e1) {// TODO 自動生成的 catch 塊this.loginflag = false;}}

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实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。