实现系统提示异地登录的多种方法

用户在不同设备上同时登录,系统加入一个异地登录提示文字功能。

方法一:基于Session的实现

步骤如下

  1. 记录用户登录信息:在用户登录成功后,记录用户的登录信息(如IP地址、设备信息等)。
  2. 存储会话信息:将当前用户的会话信息存储在一个全局的Map容器中。
  3. 检测重复登录:每次用户登录时,检查Map容器中是否已经存在该用户的会话信息。如果存在,则销毁之前的会话,并更新Map容器中的会话信息。
  4. 示用户:当检测到异地登录时,通过前端页面提示用户当前账号在其他地方登录。
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;

public class LoginController {
    private final Map<String, HttpSession> sessionMap = new HashMap<>();

    public String userLogin(User user, HttpSession session) {
        // 用户登录逻辑
        User login = userService.login(user);
        if (login == null || !user.getPwd().equals(login.getPwd())) {
            return "用户名或密码错误";
        }

        // 检查是否已经登录
        if (sessionMap.containsKey(login.getUserId().toString())) {
            // 销毁之前的会话
            sessionMap.get(login.getUserId().toString()).invalidate();
            sessionMap.remove(login.getUserId().toString());
        }

        // 存储新的会话信息
        session.setMaxInactiveInterval(30 * 60);
        session.setAttribute("user", login);
        sessionMap.put(login.getUserId().toString(), session);

        return "登录成功";
    }
}

 

方法二:基于数据库的实现

步骤如下:

  1. 修改数据库表结构:在用户表中增加一个字段session_id,用于存储用户登录后的session_id。
  2. 用户登录:在用户登录时,将当前的session_id存入数据库。
  3. 检测异地登录:在每次用户操作时,检查当前session_id与数据库中的session_id是否一致。如果不一致,则提示用户异地登录。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserService {
    private Connection connection;

    // 构造函数,初始化数据库连接
    public UserService(Connection connection) {
        this.connection = connection;
    }

    // 用户登录方法,验证用户ID和密码,并更新sessionId
    public boolean login(String userId, String password, String sessionId) throws Exception {
        // SQL查询语句,检查用户ID和密码是否匹配
        String query = "SELECT * FROM users WHERE user_id = ? AND password = ?";
        PreparedStatement statement = connection.prepareStatement(query);
        statement.setString(1, userId);
        statement.setString(2, password);
        ResultSet resultSet = statement.executeQuery();

        // 如果查询结果存在,说明用户ID和密码匹配
        if (resultSet.next()) {
            // 更新用户的sessionId
            String updateSession = "UPDATE users SET session_id = ? WHERE user_id = ?";
            PreparedStatement updateStatement = connection.prepareStatement(updateSession);
            updateStatement.setString(1, sessionId);
            updateStatement.setString(2, userId);
            updateStatement.executeUpdate();
            return true; // 登录成功
        } else {
            return false; // 登录失败
        }
    }

    // 检查sessionId是否匹配的方法
    public boolean checkSession(String userId, String sessionId) throws Exception {
        // SQL查询语句,获取用户的sessionId
        String query = "SELECT session_id FROM users WHERE user_id = ?";
        PreparedStatement statement = connection.prepareStatement(query);
        statement.setString(1, userId);
        ResultSet resultSet = statement.executeQuery();

        // 如果查询结果存在,检查sessionId是否匹配
        if (resultSet.next()) {
            String storedSessionId = resultSet.getString("session_id");
            return sessionId.equals(storedSessionId); // 返回sessionId是否匹配的结果
        } else {
            return false; // 用户ID不存在
        }
    }
}

方法三:基于Cookie的实现

步骤如下:

  1. 设置Cookie:在用户登录时,向浏览器写入一条Cookie,用于标识用户的信息。
  2. 检测Cookie:在每次用户访问时,检查Cookie中的信息是否与服务器记录一致。如果不一致,则提示用户异地登录。

 

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginController {
    private final Map<String, String> userCookieMap = new HashMap<>();

    public String userLogin(User user, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        // 用户登录逻辑
        User login = userService.login(user);
        if (login == null || !user.getPwd().equals(login.getPwd())) {
            return "用户名或密码错误";
        }

        String userId = login.getUserId().toString();
        String sessionId = session.getId();

        // 设置Cookie
        Cookie cookie = new Cookie("session_id", sessionId);
        cookie.setPath("/");
        cookie.setMaxAge(30 * 60); // 设置Cookie有效期为30分钟
        response.addCookie(cookie);

        // 存储用户的Cookie信息
        userCookieMap.put(userId, sessionId);
        session.setAttribute("user", login);

        return "登录成功";
    }

    public boolean checkCookie(HttpServletRequest request) {
        String userId = ((User) request.getSession().getAttribute("user")).getUserId().toString();
        String sessionId = null;

        // 获取Cookie中的session_id
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("session_id".equals(cookie.getName())) {
                    sessionId = cookie.getValue();
                    break;
                }
            }
        }

        // 检查Cookie中的session_id是否与服务器记录一致
        if (sessionId != null && sessionId.equals(userCookieMap.get(userId))) {
            return true;
        } else {
            return false;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值