前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Web防止用户重复登录(同一用户同时登录)的一种实现方案

Java Web防止用户重复登录(同一用户同时登录)的一种实现方案

作者头像
程裕强
发布2018-01-02 16:42:11
3.4K0
发布2018-01-02 16:42:11
举报

1.思路

在Java web项目中,有时需要防止用户重复登录,解决方案有多种。比如Spring security就可以防止用户重复登录。 这里给出一个简单的解决方案:在处理登录的login方法中,先查询数据库验证下该用户是否存在,如果存在 判断该登录账户是否已经锁定了, 然后从application内置作用域对象中取出所有的登录信息,查看该username账户是否已经登录,如果登录了,就友好提示下,反之表示可以登录,将该登录信息以键值对的方式保存在application中。 当用户注销时,删除application中相关数据即可。

2.示例代码

2.1 处理登录方法

代码语言:javascript
复制
    @RequestMapping("/checkLogin.do")
    public String checkLogin(HttpSession session, String username, String password) {
        System.out.println("checkLogin.do");

        UserBean user=userService.login(username,password);
        if(user!=null){//登录成功

            //session.getServletContext()得到时application对象
            ServletContext application=session.getServletContext();
            Map<String, String> loginMap = (Map<String, String>)application.getAttribute("loginMap");
            if(loginMap==null){
                loginMap = new HashMap<>();
            }
            for(String key:loginMap.keySet()) {
                if (user.getUsername().equals(key)) {
                    if(session.getId().equals(loginMap.get(key))) {
                        System.out.println(username+"在同一地点多次登录!");
                    }else{
                        System.out.println(username+"异地登录被拒绝!");
                        session.setAttribute("tip", "该用户已经异地登录!");
                        return "forward:/index.jsp";
                    }
                }
            }
            loginMap.put(user.getUsername(),session.getId());
            application.setAttribute("loginMap", loginMap);
            session.setAttribute("username",user.getUsername());
            System.out.println("登录成功!");
            return "redirect:/index";
        }else{
            //登录失败
            System.out.println("登录失败!");
            session.setAttribute("tip","登录失败!");
            return "forward:/index.jsp";
        }
    }

2.2 销毁Session

代码语言:javascript
复制
package cn.hadron.servlet;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Map;

/**
 * Created by root on 17-9-28.
 */
public class SessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        //在session销毁的时候 把loginMap中保存的键值对清除
        String username = event.getSession().getAttribute("username").toString();
        if(username!=null){
            Map<String, String> loginMap = (Map<String, String>)event.getSession().getServletContext().getAttribute("loginMap");
            loginMap.remove(username);
            event.getSession().getServletContext().setAttribute("loginMap",loginMap);
            System.out.println(username+"用户注销!");
        }
    }

}

2.3 web.xml

代码语言:javascript
复制
  <listener>
    <listener-class>cn.hadron.servlet.SessionListener</listener-class>
  </listener>

2.4 登录页面

代码语言:javascript
复制
${tip}
<form action="/user/checkLogin.do" method="post">
    帐号:<input type="text" name="username"><br>
    口令:<input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>

3 测试

3.1 本地登录

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

注意:本地可以多次登录。

3.2 异地登录

另找一台机器测试

这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.思路
  • 2.示例代码
    • 2.1 处理登录方法
      • 2.2 销毁Session
        • 2.3 web.xml
          • 2.4 登录页面
          • 3 测试
            • 3.1 本地登录
              • 3.2 异地登录
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档