使用 SSM 框架设计用户登录,用户登录后,可以监测查看其他哪些用户在线,重点 演示当其他用户下线(包括登录超时、关闭浏览器、退出登录操作等),该用户自动从在线 列表中消失,完整java代码
时间: 2024-05-31 14:07:05 浏览: 67
由于题目中没有给出具体的数据库表结构和页面设计,因此下面的代码只提供一个逻辑框架,仅供参考。
1. 数据库表设计
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(50) NOT NULL,
password varchar(50) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE online_user (
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) NOT NULL,
last_active_time datetime NOT NULL,
PRIMARY KEY (id)
);
2. 登录页面设计
<form action="login" method="post">
<label for="username">用户名:</label>
<input type="text" name="username" id="username" required><br>
<label for="password">密码:</label>
<input type="password" name="password" id="password" required><br>
<input type="submit" value="登录">
</form>
3. 登录操作实现
@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
private OnlineUserService onlineUserService;
@PostMapping("/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpSession session) {
User user = userService.login(username, password);
if (user != null) {
session.setAttribute("user", user);
onlineUserService.addOnlineUser(user.getId());
return "redirect:/user/home";
} else {
return "redirect:/login?error=1";
}
}
}
4. 在线用户列表页面设计
<table>
<tr>
<th>用户名</th>
<th>最近活动时间</th>
</tr>
<c:forEach var="onlineUser" items="${onlineUsers}">
<tr>
<td>${onlineUser.username}</td>
<td>${onlineUser.lastActiveTime}</td>
</tr>
</c:forEach>
</table>
5. 在线用户列表查询操作实现
@Controller
@RequestMapping("/user")
public class OnlineUserController {
@Autowired
private OnlineUserService onlineUserService;
@GetMapping("/online_users")
public String getOnlineUsers(Model model) {
List<OnlineUser> onlineUsers = onlineUserService.getOnlineUsers();
model.addAttribute("onlineUsers", onlineUsers);
return "online_users";
}
}
6. 在线用户列表自动更新实现
使用 WebSocket 技术实现在线用户列表的自动更新,具体实现方式可以参考下面的代码。
@Controller
public class WebSocketController {
private static final List<Session> sessions = new ArrayList<>();
@OnOpen
public void open(Session session) {
sessions.add(session);
}
@OnClose
public void close(Session session) {
sessions.remove(session);
}
@Scheduled(fixedDelay = 5000)
public void sendOnlineUsers() {
List<OnlineUser> onlineUsers = onlineUserService.getOnlineUsers();
String message = JSON.toJSONString(onlineUsers);
for (Session session : sessions) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
7. 用户下线处理实现
在 OnlineUserService 类中添加下线处理方法,具体实现方式可以参考下面的代码。
@Service
public class OnlineUserService {
@Autowired
private OnlineUserDao onlineUserDao;
public void addOnlineUser(int userId) {
OnlineUser onlineUser = new OnlineUser();
onlineUser.setUserId(userId);
onlineUser.setLastActiveTime(new Date());
onlineUserDao.addOnlineUser(onlineUser);
}
public List<OnlineUser> getOnlineUsers() {
return onlineUserDao.getOnlineUsers();
}
public void removeOfflineUser(int userId) {
onlineUserDao.removeOnlineUser(userId);
}
}
在 OnlineUserDao 类中添加下线处理方法,具体实现方式可以参考下面的代码。
@Repository
public class OnlineUserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void addOnlineUser(OnlineUser onlineUser) {
String sql = "INSERT INTO online_user (user_id, last_active_time) VALUES (?, ?)";
jdbcTemplate.update(sql, onlineUser.getUserId(), onlineUser.getLastActiveTime());
}
public List<OnlineUser> getOnlineUsers() {
String sql = "SELECT u.username, ou.last_active_time FROM user u, online_user ou WHERE u.id = ou.user_id";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(OnlineUser.class));
}
public void removeOnlineUser(int userId) {
String sql = "DELETE FROM online_user WHERE user_id = ?";
jdbcTemplate.update(sql, userId);
}
}
在 WebSocketController 类中添加下线处理方法,具体实现方式可以参考下面的代码。
@OnMessage
public void message(String message) {
List<OnlineUser> onlineUsers = JSON.parseArray(message, OnlineUser.class);
List<Integer> userIds = onlineUsers.stream().map(OnlineUser::getUserId).collect(Collectors.toList());
List<OnlineUser> currentOnlineUsers = onlineUserService.getOnlineUsers();
List<Integer> currentOnlineUserIds = currentOnlineUsers.stream().map(OnlineUser::getUserId).collect(Collectors.toList());
List<Integer> offlineUserIds = currentOnlineUserIds.stream().filter(id -> !userIds.contains(id)).collect(Collectors.toList());
for (int userId : offlineUserIds) {
onlineUserService.removeOfflineUser(userId);
}
}
阅读全文