用户在不同设备上同时登录,系统加入一个异地登录提示文字功能。
方法一:基于Session的实现
步骤如下
- 记录用户登录信息:在用户登录成功后,记录用户的登录信息(如IP地址、设备信息等)。
- 存储会话信息:将当前用户的会话信息存储在一个全局的Map容器中。
- 检测重复登录:每次用户登录时,检查Map容器中是否已经存在该用户的会话信息。如果存在,则销毁之前的会话,并更新Map容器中的会话信息。
- 提示用户:当检测到异地登录时,通过前端页面提示用户当前账号在其他地方登录。
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 "登录成功";
}
}
方法二:基于数据库的实现
步骤如下:
- 修改数据库表结构:在用户表中增加一个字段
session_id
,用于存储用户登录后的session_id。 - 用户登录:在用户登录时,将当前的session_id存入数据库。
- 检测异地登录:在每次用户操作时,检查当前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的实现
步骤如下:
- 设置Cookie:在用户登录时,向浏览器写入一条Cookie,用于标识用户的信息。
- 检测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;
}
}
}