Commit 26bf7529 authored by tangtuo's avatar tangtuo

新增更新记录插入时间戳以及记录修改时间戳的拦截器

用户被挤下线之后,修改提示内容
parent b0a834bd
package com.fzm.common.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.SystemClock;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.function.Supplier;
/**
* 新增,更新时,自动更新字段
*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.debug("start insert fill ....");
Long currentTime = SystemClock.now();
this.setFieldValByName("createTime", currentTime, metaObject);
this.setFieldValByName("updateTime", currentTime, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.debug("start update fill ....");
Long currentTime = SystemClock.now();
this.setFieldValByName("updateTime", currentTime, metaObject);
}
}
\ No newline at end of file
package com.fzm.common.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
......@@ -24,4 +27,14 @@ public abstract class BaseEntity {
@ApiModelProperty("修改时间")
private Date updateDate;
@ApiModelProperty("记录创建的时间戳")
@TableField(fill = FieldFill.INSERT)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Long createTime;
@ApiModelProperty("记录更新的时间戳")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Long updateTime;
}
package com.fzm.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fzm.common.constant.TokenConstant;
import io.swagger.annotations.ApiModel;
......@@ -61,6 +59,16 @@ public class User extends AbstractUser {
@ApiModelProperty("修改时间")
private Date updateDate;
@ApiModelProperty("记录创建的时间戳")
@TableField(fill = FieldFill.INSERT)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Long createTime;
@ApiModelProperty("记录更新的时间戳")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Long updateTime;
@Override
public String appId() {
......
package com.fzm.common.exception.handler;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpStatus;
import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.model.ResponseModel;
import com.fzm.common.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.ObjectError;
......@@ -13,6 +17,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
......@@ -41,6 +46,26 @@ public class GlobalExceptionHandler {
return ResponseModel.fail(exception);
}
@ExceptionHandler(value = NotLoginException.class)
public ResponseModel<String> handlerNotLoginException(NotLoginException exception) {
log.error(exception.getMessage(), exception);
response.setStatus(HttpStatus.HTTP_INTERNAL_ERROR);
if (exception.getMessage().contains("token已被顶下线")) {
// 获取已过期的token
String expireToken = StpUtil.getTokenValue();
// 从已过期的token中获取用户id
Integer userId = JwtUtil.getUserIdFromToken(expireToken);
// 获取最新的token
String tokenValue = StpUtil.getTokenValueByLoginId(userId);
Date createTime = JwtUtil.getCreateTimeFromToken(tokenValue);
String format = DateUtil.format(createTime, "yyyy-MM-dd HH:mm:ss");
return ResponseModel.fail(ResultCode.UNAUTHORIZED,
String.format("您的账号于 %s 登录另外一台设备,如非您本人所为,请立即修改密码", format));
}
return ResponseModel.fail(exception);
}
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public ResponseModel<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
log.error(e.getMessage(), e);
......
......@@ -67,15 +67,13 @@ public class JwtUtil {
/**
* 从token中获取登录用户名
*/
public static String getUserNameFromToken(String token) {
String username;
public static Date getCreateTimeFromToken(String token) {
try {
Claims claims = getClaimsFromToken(token);
username = claims.getSubject();
return claims.get(CLAIM_KEY_CREATED, Date.class);
} catch (Exception e) {
username = null;
throw GlobalException.newException(ResultCode.TOKEN_VALID_ERROR, e.getMessage());
}
return username;
}
/**
......
......@@ -65,7 +65,7 @@ spring:
# token风格
#token-style: uuid
# 是否输出操作日志
is-log: false
is-log: true
tokenPrefix: Bearer
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: false
......
......@@ -65,7 +65,7 @@ spring:
# token风格
#token-style: uuid
# 是否输出操作日志
is-log: false
is-log: true
tokenPrefix: Bearer
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: false
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment