import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Component
public class FTPLimitLogin {
private RedisTemplate<String, Object> redisTemplate;
public FTPLimitLogin(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public boolean checkLogin(String ip, String userName) {
String key = "ftp_login_info";
if (redisTemplate.opsForHash().hasKey(key, ip)) {
String existingUserName = (String) redisTemplate.opsForHash().get(key, ip);
if (!existingUserName.equals(userName)) {
return false; // 已有其他用户通过此 IP 连接,登录失败
}
}
// 如果没有已有记录或用户名相同,进行登录操作
ConcurrentHashMap<String, Object> loginInfo = new ConcurrentHashMap<>();
loginInfo.put("userName", userName);
loginInfo.put("lastActivityTime", System.currentTimeMillis());
redisTemplate.opsForHash().put(key, ip, loginInfo);
return true; // 登录成功
}
public void logout(String ip) {
String key = "ftp_login_info";
redisTemplate.opsForHash().delete(key, ip);
}
public void markActivity(String ip) {
String key = "ftp_login_info";
ConcurrentHashMap<String, Object> loginInfo = (ConcurrentHashMap<String, Object>) redisTemplate.opsForHash().get(key, ip);
if (loginInfo!= null) {
loginInfo.put("lastActivityTime", System.currentTimeMillis());
redisTemplate.opsForHash().put(key, ip, loginInfo);
}
}
public void startWatchdog() {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(() -> {
String key = "ftp_login_info";
for (Object field : redisTemplate.opsForHash().keys(key)) {
String ip = (String) field;
ConcurrentHashMap<String, Object> loginInfo = (ConcurrentHashMap<String, Object>) redisTemplate.opsForHash().get(key, ip);
if (loginInfo!= null) {
long currentTime = System.currentTimeMillis();
long lastActivityTime = (long) loginInfo.get("lastActivityTime");
if (currentTime - lastActivityTime > 30000) { // 30 秒内无活动
logout(ip); // 自动注销
System.out.println(ip + " 因超时被自动注销。");
}
}
}
}, 30, 30, TimeUnit.SECONDS);
}
public static void main(String[] args) {
// 假设已正确配置并注入 RedisTemplate
RedisTemplate<String, Object> redisTemplate = null;
FTPLimitLogin ftpLimitLogin = new FTPLimitLogin(redisTemplate);
ftpLimitLogin.startWatchdog();
// 用户 1 尝试登录
String ip1 = "192.168.1.1";
String userName1 = "user1";
boolean canLogin1 = ftpLimitLogin.checkLogin(ip1, userName1);
if (canLogin1) {
System.out.println("user1 登录成功");
// 模拟用户 1 活动
ftpLimitLogin.markActivity(ip1);
} else {
System.out.println("user1 登录失败,已有用户连接");
}
// 一段时间没有活动
try {
Thread.sleep(35000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 用户 2 尝试登录
String ip2 = "192.168.1.2";
String userName2 = "user2";
boolean canLogin2 = ftpLimitLogin.checkLogin(ip2, userName2);
if (canLogin2) {
System.out.println("user2 登录成功");
} else {
System.out.println("user2 登录失败,已有用户连接");
}
}
}