mirror of
https://codeup.aliyun.com/64f7d6b8ce01efaafef1e678/coal/coal.git
synced 2026-07-27 16:03:15 +08:00
用户会话管理
This commit is contained in:
@@ -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> {
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user