Java實現(xiàn)用戶不可重復(fù)登錄功能
總述
前些天,無意之間想到這個問題,感覺挺實用,有必要整理一下。隨手寫了一個簡單的mode,感覺并不算難。思路理順其實挺簡單的。
為實現(xiàn)用戶不可同時登陸,只要想想現(xiàn)實中新浪,百度等,只要一處登陸就將另一處的給“擠”下去,就可以知道實現(xiàn)結(jié)果為何。然后再逆推之,即可形成較為清晰的思路。我們一起來探討一下。
首先,我們得明白用戶登錄使用什么登陸的,即用戶在線的原理。這只是將用戶的對象存放在了session中而已,然后再frame中進(jìn)行調(diào)用,其他特定頁面也進(jìn)行直接引用就行。那么實現(xiàn)“擠下來”的功能就是讓新生成的session有效,讓原來存放用戶的session失效就行。到此,大體思路已經(jīng)有了。那怎么實現(xiàn)呢?
想要知道怎么實現(xiàn),就必須要明白session存放用戶對象的過程了。在用戶登錄之后,我們可以得到用戶的對象user,而存放到session中需要執(zhí)行session.setAttribute(key,value);
我們將用戶的userId或是其他的唯一標(biāo)識存為key,將用戶對象存為值。這樣就能隨時隨地調(diào)用唯一用戶了。user存放的問題解決了,那相同 登錄 時session廢除的問題呢?
這個其實也不難,我們可以更具session的特性一樣,用map進(jìn)行存貯,將用戶的標(biāo)識存為key,而將其所對應(yīng)的session存為value,那么當(dāng)重復(fù)用戶登錄時,只需要取出對應(yīng)的session,將其invalidate就行了。
至此,實現(xiàn)思路已經(jīng)明了,聒噪了這么久,大家都急不可耐地想看代碼了吧?以下是代碼:
前置準(zhǔn)備,jsp界面
界面很簡單,只是一個簡單的登錄界面
<form action ="<%=request.getContextPath()%>/UserWXPServlet" method = "post"> 用戶名<input type = "text" name = "username"/><br/> 密碼<input type = "text" name = "password"/><br/> <input type = "submit" value ="提交"/> </form>
成功后跳轉(zhuǎn)頁面
歡迎:${sessionScope.user.username}登陸!<br/>
我這沒有寫失敗頁面,大家可以自己寫,失敗頁面也沒什么好說的了
entity和登錄的實現(xiàn)
user的javabean
private String username; private String password; public User() { } public User(String user, String password) { super(); this.username = user; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
登錄user的service實現(xiàn)方法,這里就不寫dao和接口了,一切以簡單為
public boolean dologin(User user){ Properties pro = new Properties(); InputStream is = UserWXPServlet.class.getClassLoader().getResourceAsStream("user_wxp.properties"); String password = null; System.out.println(is+"--------->"+pro); if(user==null){ return false; } try { pro.load(is); password = pro.getProperty(user.getUsername()); if(user.getPassword()!=null&&user.getPassword().equals(password)){ System.out.println("登陸成功"); return true; } } catch (IOException e) { e.printStackTrace(); }finally{ if(is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; }
登錄成功返回true,失敗則返回false。
Servlet和相應(yīng)的邏輯工具類
接下來的代碼就到了真正操作用戶的代碼了
本人在這里定義了兩個類,一個工具類,一個核心servlet處理類
在工具類中加入了一些公共的元素,如以下代碼:
/** * 每一個用戶存放一個session。便于各種操作?。。? */ public static Map<String, HttpSession> mapSession = new HashMap<String,HttpSession>(); 用戶退出的代碼(必須飛廢除session或是remove相應(yīng)的用戶對象): [java] view plain copy public static void userLogout(String username){ if(mapSession.get(username)!=null){ //得到需要退出的用戶的session HttpSession session = mapSession.get(username); //在map<username,session>中移除該用戶,記住想要退出該用戶,必須將該session廢除或是remove掉user mapSession.remove(username); //得到session的所屬性合集 Enumeration e = session.getAttributeNames(); //刪除所有屬性 while(e.hasMoreElements()){ String sessionName = (String) e.nextElement(); session.removeAttribute(sessionName); } //廢除該session session.invalidate(); } }
Servlet的代碼如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = new User(username, password); UserService userService = new UserService(); HttpSession session = request.getSession(); if(userService.dologin(user)){ //登錄成功之后將用戶插入到session中 session.setAttribute("user", user); if(cheackSession(username)){ //如果該session在此之前已經(jīng)存在,則將該用戶進(jìn)行退出操作 DbUtil.userLogout(username); } //將新的session存放到map<username,session>中 DbUtil.mapSession.put(username, session); //操作成功,跳轉(zhuǎn),此處最好為重定向,讓別人知道登錄成功了 request.getRequestDispatcher("login").forward(request, response); return ; } //此處跳轉(zhuǎn)到失敗頁面,如果讀者有興趣,可以自行添加 }
其中cheackSession(username) 的代碼如下:
/** * 檢查是否已經(jīng)含有此session * @param username * @return true:已經(jīng)存在,該刪! false:未存在 */ private boolean cheackSession(String username){ HttpSession session = DbUtil.mapSession.get(username); if(session!=null){ return true; } return false; }
最后附上Servlet的xml配置
<servlet> <description> 用于測試 ,用戶不可重復(fù)登錄 </description> <display-name>UserWXPServlet</display-name> <servlet-name>UserWXPServlet</servlet-name> <servlet-class>com.fingard.rabbit.wxp_test.Servlet.UserWXPServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserWXPServlet</servlet-name> <url-pattern>/UserWXPServlet</url-pattern> </servlet-mapping>
以上所述是小編給大家介紹的Java實現(xiàn)用戶不可重復(fù)登錄功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Java CRM系統(tǒng)用戶登錄功能實現(xiàn)代碼實例
- Java+mysql用戶注冊登錄功能
- JavaWeb使用Cookie模擬實現(xiàn)自動登錄功能(不需用戶名和密碼)
- JavaWeb實現(xiàn)用戶登錄注冊功能實例代碼(基于Servlet+JSP+JavaBean模式)
- Java struts2 validate用戶登錄校驗功能實現(xiàn)
- JavaWeb實戰(zhàn)之用Servlet+JDBC實現(xiàn)用戶登錄與注冊
- Java實現(xiàn)多用戶注冊登錄的幸運(yùn)抽獎
- Java 實現(xiàn)模擬用戶登錄的示例代碼
- Java實戰(zhàn)之實現(xiàn)用戶登錄
相關(guān)文章
Java Adapter 適配器模式(類適配器,對象適配器)優(yōu)缺點對比
這篇文章主要介紹了Java 適配器模式(類適配器,對象適配器)優(yōu)缺點對比的相關(guān)資料,java 適配器在基礎(chǔ)知識中還是比較重要的,這里就說下如何使用,需要的朋友可以參考下2016-12-12Synchronized?和?ReentrantLock?的實現(xiàn)原理及區(qū)別
這篇文章主要介紹了Synchronized?和?ReentrantLock?的實現(xiàn)原理及區(qū)別,文章為榮啊主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法
這篇文章主要介紹了SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式
這篇文章主要介紹了postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法
這篇文章主要介紹了Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07