相关文章推荐
文雅的沙滩裤  ·  Navigator:canShare() ...·  3 月前    · 
发怒的花卷  ·  ASP.NET MVC 4 发行说明 | ...·  2 月前    · 
老实的橙子  ·  HTML、CSS 和 DOM ...·  2 月前    · 
有情有义的香烟  ·  创建和触发事件 - 事件参考 | MDN·  2 月前    · 
魁梧的硬币  ·  @document - CSS:层叠样式表 ...·  1 月前    · 
八块腹肌的拖把  ·  ​开学不到一个月,跑步129公里!杭二中出现 ...·  8 月前    · 
喝醉的卤蛋  ·  在Webex ...·  8 月前    · 
卖萌的眼镜  ·  对市十六届人大二次会议第0967号代表建议的 ...·  11 月前    · 
文武双全的书包  ·  2018北京车展:Isdera ...·  2 年前    · 
憨厚的柚子  ·  【微蓝7】别克微蓝7报价,别克微蓝7图片_易车·  2 年前    · 
Code  ›  Java Web防止用户重复登录(同一用户同时登录)的一种实现方案开发者社区
string session web技术
https://cloud.tencent.com/developer/article/1010943
心软的柿子
1 年前
作者头像
程裕强
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 大数据学习笔记 > Java Web防止用户重复登录(同一用户同时登录)的一种实现方案

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

作者头像
程裕强
发布 于 2018-01-02 16:42:11
2.7K 0
发布 于 2018-01-02 16:42:11
举报

1.思路

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

2.示例代码

2.1 处理登录方法

    @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

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

  <listener>
    <listener-class>cn.hadron.servlet.SessionListener</listener-class>
  </listener>

2.4 登录页面

${tip}
<form action="/user/checkLogin.do" method="post">
 
推荐文章
文雅的沙滩裤  ·  Navigator:canShare() 方法 - Web API | MDN
3 月前
发怒的花卷  ·  ASP.NET MVC 4 发行说明 | Microsoft Learn
2 月前
老实的橙子  ·  HTML、CSS 和 DOM 中的空白符是如何处理的 - Web API | MDN
2 月前
有情有义的香烟  ·  创建和触发事件 - 事件参考 | MDN
2 月前
魁梧的硬币  ·  @document - CSS:层叠样式表 | MDN
1 月前
八块腹肌的拖把  ·  ​开学不到一个月,跑步129公里!杭二中出现健身“跑神”_同学_运动_成绩
8 月前
喝醉的卤蛋  ·  在Webex Meetings中開啟錄製檔轉錄文字, Webex Webinars,和Webex Events(傳統版)
8 月前
卖萌的眼镜  ·  对市十六届人大二次会议第0967号代表建议的答复_建议提案结果公开_上海市知识产权局
11 月前
文武双全的书包  ·  2018北京车展:Isdera Commendatore GT_搜狐汽车_搜狐网
2 年前
憨厚的柚子  ·  【微蓝7】别克微蓝7报价,别克微蓝7图片_易车
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号