欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年12月28日 11:17:59   作者:陌殤塵  
這篇文章主要介紹了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)站的支持!

相關(guān)文章

  • 配置gateway+nacos動態(tài)路由管理流程

    配置gateway+nacos動態(tài)路由管理流程

    這篇文章主要介紹了配置gateway+nacos動態(tài)路由管理流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • ES修改字段類型的操作方式

    ES修改字段類型的操作方式

    ES修改字段類型是指在已有的索引中,通過特定的操作方式將某個字段的類型修改為其它類型,這篇文章主要介紹了ES修改字段類型的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java動態(tài)代理靜態(tài)代理實例分析

    Java動態(tài)代理靜態(tài)代理實例分析

    這篇文章主要介紹了Java動態(tài)代理靜態(tài)代理實例分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java Adapter 適配器模式(類適配器,對象適配器)優(yōu)缺點對比

    Java Adapter 適配器模式(類適配器,對象適配器)優(yōu)缺點對比

    這篇文章主要介紹了Java 適配器模式(類適配器,對象適配器)優(yōu)缺點對比的相關(guān)資料,java 適配器在基礎(chǔ)知識中還是比較重要的,這里就說下如何使用,需要的朋友可以參考下
    2016-12-12
  • 新手了解java基礎(chǔ)知識(二)

    新手了解java基礎(chǔ)知識(二)

    這篇文章主要介紹了Java基礎(chǔ)知識,本文介紹了Java語言相關(guān)的基礎(chǔ)知識、歷史介紹、主要應(yīng)用方向等內(nèi)容,需要的朋友可以參考下,希望對你有所幫助
    2021-07-07
  • Synchronized?和?ReentrantLock?的實現(xiàn)原理及區(qū)別

    Synchronized?和?ReentrantLock?的實現(xiàn)原理及區(qū)別

    這篇文章主要介紹了Synchronized?和?ReentrantLock?的實現(xiàn)原理及區(qū)別,文章為榮啊主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法

    SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法

    這篇文章主要介紹了SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式

    postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式

    這篇文章主要介紹了postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • spring boot教程之全局處理異常封裝

    spring boot教程之全局處理異常封裝

    這篇文章主要給大家介紹了關(guān)于spring boot教程之全局處理異常封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法

    Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法

    這篇文章主要介紹了Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論