首页>代码>Springboot开发的精简博客系统 >/noteblogv4-master/src/main/java/me/wuwenbin/noteblogv4/config/application/NBSession.java
package me.wuwenbin.noteblogv4.config.application;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.wuwenbin.noteblogv4.model.entity.permission.NBSysUser;
import me.wuwenbin.noteblogv4.util.NBUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.time.LocalDateTime;

import static java.lang.Boolean.FALSE;
import static java.time.LocalDateTime.now;

/**
 * created by Wuwenbin on 2018/2/7 at 20:56
 * @author wuwenbin
 */
@Slf4j
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class NBSession implements Serializable {

    @Builder.Default
    private String id = IdUtil.randomUUID();
    private String host;
    @Builder.Default
    private LocalDateTime startTimestamp = now();
    @Builder.Default
    private LocalDateTime lastAccessTime = now();
    @Builder.Default
    private long timeout = DEFAULT_TIMEOUT_MILLS;
    @Builder.Default
    private LocalDateTime expireTimestamp = now().plusSeconds(DEFAULT_TIMEOUT_MILLS / 1000);
    @Builder.Default
    private boolean expired = FALSE;
    private NBSysUser sessionUser;

    public static final long DEFAULT_TIMEOUT_MILLS = 30 * 60 * 1000;

    private static HttpServletRequest getRequest() {
        ServletRequestAttributes ra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        assert ra != null;
        return ra.getRequest();
    }

    /**
     * 更新session
     */
    public void update() {
        String info = "update session for id:[{}], at [{}] by url:[{}] with ip:[{}]";
        log.info(StrUtil.format(info, this.getId(), LocalDateTime.now(), getRequest().getRequestURL()), NBUtils.getRemoteAddress(getRequest()));
        this.lastAccessTime = now();
        this.expireTimestamp = lastAccessTime.plusSeconds(getTimeout() / 1000);
        if (!host.equals(NBUtils.getRemoteAddress(getRequest()))) {
            log.info("ip变动,存在非法访问情况");
            this.expired = true;
        }
    }

    /**
     * 注销session,即把session变为过期状态
     */
    public void destroy() {
        String info = "destroy session for id:[{}], at [{}]";
        log.info(StrUtil.format(info, this.getId(), LocalDateTime.now()));
        this.expired = true;
    }


    public boolean isExpired() {
        if (this.expired) {
            return true;
        }

        long timeout = getTimeout();
        if (timeout >= 0) {
            LocalDateTime lastAccessTime = getLastAccessTime();
            if (lastAccessTime == null) {
                throw new IllegalStateException("最后访问时间为空");
            }
            LocalDateTime expire = getExpireTimestamp();
            boolean isExpire = LocalDateTime.now().isAfter(lastAccessTime.plusSeconds(timeout / 1000));
            log.info("当前时间:{},最后访问时间:{},过期时间:{},session 是否过期:{}", LocalDateTime.now(), lastAccessTime, expire, isExpire);
            if (isExpire) {
                this.expired = true;
            }
            return isExpire;
        }
        this.expired = true;
        return true;
    }
}
最近下载更多
yayacui  LV2 10月28日
angaochong  LV5 10月23日
y1214435276  LV9 9月26日
Peny_ZH  LV5 9月22日
murphy  LV7 7月3日
xunxia  LV7 6月29日
来一杯西瓜冰咩  LV6 5月13日
qiangmin1223  LV12 4月24日
xiaokang1  LV10 4月23日
zhouenyi  LV6 3月14日
最近浏览更多
haomc052829  LV2 昨天
cpk159  LV8 11月28日
krispeng  LV13 11月20日
xianyu091012  LV4 11月18日
12347658  LV1 11月13日
yayacui  LV2 10月28日
喜欢夜雨吗  LV4 10月25日
angaochong  LV5 10月23日
栾庆浩 10月23日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友