服务器之家

服务器之家 > 正文

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

时间:2020-07-20 11:57     来源/作者:陌殇尘

 总述

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

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

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

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

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

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

前置准备,jsp界面

界面很简单,只是一个简单的登录界面

?
1
2
3
4
5
<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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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和接口了,一切以简单为

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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处理类

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
   * 每一个用户存放一个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的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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) 的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 检查是否已经含有此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配置

?
1
2
3
4
5
6
7
8
9
10
11
12
<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实现用户不可重复登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://blog.csdn.net/qq_33347703/article/details/53905751

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
返回顶部