用户会话管理

This commit is contained in:
2023-07-29 23:56:24 +08:00
parent 1698946116
commit e28f3f1a59
3 changed files with 128 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
package cn.lihongjie.coal.dao;
import cn.lihongjie.coal.entity.UserSessionEntity;
import org.springframework.stereotype.Repository;
@Repository
public interface UserSessionRepository extends BaseRepository<UserSessionEntity> {
}

View File

@@ -0,0 +1,27 @@
package cn.lihongjie.coal.entity;
import cn.lihongjie.coal.entity.base.OrgBaseEntity;
import jakarta.persistence.*;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
@Data
@Entity
@Getter
@Setter
public class UserSessionEntity extends OrgBaseEntity {
@ManyToOne
@JoinColumn(name = "user_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
private UserEntity user;
private LocalDateTime expireAt;
}

View File

@@ -0,0 +1,93 @@
package cn.lihongjie.coal.service;
import cn.lihongjie.coal.dao.UserSessionRepository;
import cn.lihongjie.coal.entity.UserEntity;
import cn.lihongjie.coal.entity.UserSessionEntity;
import jakarta.annotation.PostConstruct;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class UserSessionService {
@Autowired
UserSessionRepository repository;
@PostConstruct
public void init(){
Executors.newScheduledThreadPool(1).schedule(this::autoExpire, 1, TimeUnit.MINUTES);
}
private void autoExpire() {
List<UserSessionEntity> expireAt = this.repository.findAll(new Specification<UserSessionEntity>() {
@Override
public Predicate toPredicate(Root<UserSessionEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.lessThanOrEqualTo(root.get("expireAt"), LocalDateTime.now());
}
});
if (CollectionUtils.isNotEmpty(expireAt)) {
log.info("清理获取会话 {} 条", expireAt.size());
for (UserSessionEntity session : expireAt) {
logout(session.getId());
}
}
}
public UserSessionEntity login(UserEntity user) {
UserSessionEntity session = new UserSessionEntity();
session.setUser(user);
session.setExpireAt(LocalDateTime.now().plusHours(1));
repository.save(session);
return session;
}
public void refresh(UserSessionEntity session) {
session.setExpireAt(LocalDateTime.now().plusHours(1));
repository.save(session);
}
public void logout(String sessionId) {
repository.deleteById(sessionId);
}
}