国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java實(shí)現(xiàn)用戶不可重復(fù)登錄功能

2019-11-26 13:22:29
字體:
供稿:網(wǎng)友

 總述

前些天,無意之間想到這個問題,感覺挺實(shí)用,有必要整理一下。隨手寫了一個簡單的mode,感覺并不算難。思路理順其實(shí)挺簡單的。

為實(shí)現(xiàn)用戶不可同時登陸,只要想想現(xiàn)實(shí)中新浪,百度等,只要一處登陸就將另一處的給“擠”下去,就可以知道實(shí)現(xiàn)結(jié)果為何。然后再逆推之,即可形成較為清晰的思路。我們一起來探討一下。

首先,我們得明白用戶登錄使用什么登陸的,即用戶在線的原理。這只是將用戶的對象存放在了session中而已,然后再frame中進(jìn)行調(diào)用,其他特定頁面也進(jìn)行直接引用就行。那么實(shí)現(xiàn)“擠下來”的功能就是讓新生成的session有效,讓原來存放用戶的session失效就行。到此,大體思路已經(jīng)有了。那怎么實(shí)現(xiàn)呢?

想要知道怎么實(shí)現(xiàn),就必須要明白session存放用戶對象的過程了。在用戶登錄之后,我們可以得到用戶的對象user,而存放到session中需要執(zhí)行session.setAttribute(key,value); 我們將用戶的userId或是其他的唯一標(biāo)識存為key,將用戶對象存為值。這樣就能隨時隨地調(diào)用唯一用戶了。user存放的問題解決了,那相同 登錄 時session廢除的問題呢?

這個其實(shí)也不難,我們可以更具session的特性一樣,用map進(jìn)行存貯,將用戶的標(biāo)識存為key,而將其所對應(yīng)的session存為value,那么當(dāng)重復(fù)用戶登錄時,只需要取出對應(yīng)的session,將其invalidate就行了。

至此,實(shí)現(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和登錄的實(shí)現(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實(shí)現(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 copypublic 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實(shí)現(xiàn)用戶不可重復(fù)登錄功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蒙山县| 大石桥市| 荥经县| 金塔县| 黔西| 镇沅| 基隆市| 阜阳市| 阿坝| 西安市| 博湖县| 芒康县| 巴青县| 大名县| 新源县| 泸水县| 南安市| 西贡区| 始兴县| 福清市| 闽清县| 鄢陵县| 邳州市| 香港 | 陆良县| 台东市| 江北区| 莆田市| 金湖县| 雅江县| 贡嘎县| 志丹县| 如皋市| 繁昌县| 溧水县| 富阳市| 千阳县| 芮城县| 会东县| 盐亭县| 金坛市|