You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.1 KiB
98 lines
3.1 KiB
package org.ros.chatto.logged;
|
|
|
|
import java.time.Instant;
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
|
|
import javax.servlet.http.HttpSessionBindingEvent;
|
|
import javax.servlet.http.HttpSessionBindingListener;
|
|
import javax.servlet.http.HttpSessionEvent;
|
|
|
|
import org.ros.chatto.model.ChatUser;
|
|
import org.ros.chatto.model.UserSession;
|
|
import org.ros.chatto.repository.UserSessionRepository;
|
|
import org.ros.chatto.service.UserService;
|
|
import org.ros.chatto.service.UserTokenService;
|
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.web.context.WebApplicationContext;
|
|
import org.springframework.web.context.support.WebApplicationContextUtils;
|
|
|
|
import lombok.Getter;
|
|
import lombok.Setter;
|
|
|
|
@Component
|
|
@Getter
|
|
@Setter
|
|
public class LoggedUser implements HttpSessionBindingListener {
|
|
|
|
private final String username;
|
|
private UserService userService;
|
|
private UserTokenService userTokenService;
|
|
|
|
public LoggedUser(String username) {
|
|
this.username = username;
|
|
userService = BeanUtil.getBean(UserService.class);
|
|
userTokenService = BeanUtil.getBean(UserTokenService.class);
|
|
}
|
|
|
|
public LoggedUser() {
|
|
username = null;
|
|
}
|
|
|
|
@Override
|
|
public void valueBound(HttpSessionBindingEvent event) {
|
|
// UserService userService = getUserService(event);
|
|
UserService userService = BeanUtil.getBean(UserService.class);
|
|
// UserSessionRepository userSessionRepository = getUserSessionRepository(event);
|
|
UserSessionRepository userSessionRepository = BeanUtil.getBean(UserSessionRepository.class);
|
|
LoggedUser user = (LoggedUser) event.getValue();
|
|
|
|
Instant instant = Instant.now();
|
|
ChatUser chatUser = userService.findByUserName(user.getUsername());
|
|
|
|
UserSession userSession = userSessionRepository.findByUserName(user.getUsername());
|
|
|
|
if (userSession == null) {
|
|
userSession = new UserSession();
|
|
}
|
|
|
|
userSession.setUser(chatUser);
|
|
userSession.setTimeStamp(instant);
|
|
userSession.setOnline(true);
|
|
userSession.setNumSessions(userSession.getNumSessions() + 1);
|
|
userSessionRepository.save(userSession);
|
|
}
|
|
|
|
@Override
|
|
public void valueUnbound(HttpSessionBindingEvent event) {
|
|
LoggedUser user = (LoggedUser) event.getValue();
|
|
|
|
UserService userService = BeanUtil.getBean(UserService.class);;
|
|
UserSessionRepository userSessionRepository = BeanUtil.getBean(UserSessionRepository.class);;
|
|
Instant instant = Instant.now();
|
|
|
|
ChatUser chatUser = userService.findByUserName(user.getUsername());
|
|
|
|
UserSession userSession = userSessionRepository.findByUserName(user.getUsername());
|
|
|
|
if (userSession == null) {
|
|
// userSession = new UserSession();
|
|
throw new UsernameNotFoundException("User session not found");
|
|
}
|
|
|
|
int numSessions = userSession.getNumSessions();
|
|
|
|
if (--numSessions == 0) {
|
|
userSession.setOnline(false);
|
|
}
|
|
|
|
userSession.setUser(chatUser);
|
|
userSession.setTimeStamp(instant);
|
|
userSession.setNumSessions(numSessions);
|
|
userSessionRepository.save(userSession);
|
|
|
|
userTokenService.deleteToken(chatUser.getUserName());
|
|
TokenCacheUtil.evictSingleTokenValue(chatUser.getUserName());
|
|
}
|
|
}
|