欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现用户不可重复登录功能

程序员文章站 2024-03-09 16:26:23
 总述 前些天,无意之间想到这个问题,感觉挺实用,有必要整理一下。随手写了一个简单的mode,感觉并不算难。思路理顺其实挺简单的。 为实现用户不可同时登陆,只...

 总述

前些天,无意之间想到这个问题,感觉挺实用,有必要整理一下。随手写了一个简单的mode,感觉并不算难。思路理顺其实挺简单的。

为实现用户不可同时登陆,只要想想现实中新浪,百度等,只要一处登陆就将另一处的给“挤”下去,就可以知道实现结果为何。然后再逆推之,即可形成较为清晰的思路。我们一起来探讨一下。

首先,我们得明白用户登录使用什么登陆的,即用户在线的原理。这只是将用户的对象存放在了session中而已,然后再frame中进行调用,其他特定页面也进行直接引用就行。那么实现“挤下来”的功能就是让新生成的session有效,让原来存放用户的session失效就行。到此,大体思路已经有了。那怎么实现呢?

想要知道怎么实现,就必须要明白session存放用户对象的过程了。在用户登录之后,我们可以得到用户的对象user,而存放到session中需要执行session.setattribute(key,value); 我们将用户的userid或是其他的唯一标识存为key,将用户对象存为值。这样就能随时随地调用唯一用户了。user存放的问题解决了,那相同 登录 时session废除的问题呢?

这个其实也不难,我们可以更具session的特性一样,用map进行存贮,将用户的标识存为key,而将其所对应的session存为value,那么当重复用户登录时,只需要取出对应的session,将其invalidate就行了。

至此,实现思路已经明了,聒噪了这么久,大家都急不可耐地想看代码了吧?以下是代码:

前置准备,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> 

成功后跳转页面

欢迎:${sessionscope.user.username}登陆!<br/> 

我这没有写失败页面,大家可以自己写,失败页面也没什么好说的了

entity和登录的实现

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实现方法,这里就不写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和相应的逻辑工具类

接下来的代码就到了真正操作用户的代码了

本人在这里定义了两个类,一个工具类,一个核心servlet处理类

在工具类中加入了一些公共的元素,如以下代码:

/** 
   * 每一个用户存放一个session。便于各种操作!!! 
   */ 
  public static map<string, httpsession> mapsession = new hashmap<string,httpsession>(); 
用户退出的代码(必须飞废除session或是remove相应的用户对象):
[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在此之前已经存在,则将该用户进行退出操作 
      dbutil.userlogout(username); 
    } 
    //将新的session存放到map<username,session>中 
    dbutil.mapsession.put(username, session); 
    //操作成功,跳转,此处最好为重定向,让别人知道登录成功了 
    request.getrequestdispatcher("login").forward(request, response); 
    return ; 
  } 
  //此处跳转到失败页面,如果读者有兴趣,可以自行添加 
} 

其中cheacksession(username) 的代码如下:

/** 
 * 检查是否已经含有此session 
 * @param username 
 * @return true:已经存在,该删! false:未存在 
 */ 
private boolean cheacksession(string username){ 
  httpsession session = dbutil.mapsession.get(username); 
  if(session!=null){ 
    return true; 
  } 
  return false; 
} 

最后附上servlet的xml配置

<servlet> 
  <description> 
  用于测试 ,用户不可重复登录 
  </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实现用户不可重复登录功能,希望对大家有所帮助