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; package com.fzm.common.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
...@@ -24,4 +27,14 @@ public abstract class BaseEntity { ...@@ -24,4 +27,14 @@ public abstract class BaseEntity {
@ApiModelProperty("修改时间") @ApiModelProperty("修改时间")
private Date updateDate; 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; package com.fzm.common.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.fzm.common.constant.TokenConstant; import com.fzm.common.constant.TokenConstant;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
...@@ -61,6 +59,16 @@ public class User extends AbstractUser { ...@@ -61,6 +59,16 @@ public class User extends AbstractUser {
@ApiModelProperty("修改时间") @ApiModelProperty("修改时间")
private Date updateDate; 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 @Override
public String appId() { public String appId() {
......
package com.fzm.common.exception.handler; 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 cn.hutool.http.HttpStatus;
import com.fzm.common.enums.ResultCode; import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException; import com.fzm.common.exception.GlobalException;
import com.fzm.common.model.ResponseModel; import com.fzm.common.model.ResponseModel;
import com.fzm.common.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.ObjectError; import org.springframework.validation.ObjectError;
...@@ -13,6 +17,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; ...@@ -13,6 +17,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -41,6 +46,26 @@ public class GlobalExceptionHandler { ...@@ -41,6 +46,26 @@ public class GlobalExceptionHandler {
return ResponseModel.fail(exception); 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}) @ExceptionHandler(value = {MethodArgumentNotValidException.class})
public ResponseModel<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { public ResponseModel<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
......
...@@ -67,15 +67,13 @@ public class JwtUtil { ...@@ -67,15 +67,13 @@ public class JwtUtil {
/** /**
* 从token中获取登录用户名 * 从token中获取登录用户名
*/ */
public static String getUserNameFromToken(String token) { public static Date getCreateTimeFromToken(String token) {
String username;
try { try {
Claims claims = getClaimsFromToken(token); Claims claims = getClaimsFromToken(token);
username = claims.getSubject(); return claims.get(CLAIM_KEY_CREATED, Date.class);
} catch (Exception e) { } catch (Exception e) {
username = null; throw GlobalException.newException(ResultCode.TOKEN_VALID_ERROR, e.getMessage());
} }
return username;
} }
/** /**
......
...@@ -65,7 +65,7 @@ spring: ...@@ -65,7 +65,7 @@ spring:
# token风格 # token风格
#token-style: uuid #token-style: uuid
# 是否输出操作日志 # 是否输出操作日志
is-log: false is-log: true
tokenPrefix: Bearer tokenPrefix: Bearer
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: false is-concurrent: false
......
...@@ -65,7 +65,7 @@ spring: ...@@ -65,7 +65,7 @@ spring:
# token风格 # token风格
#token-style: uuid #token-style: uuid
# 是否输出操作日志 # 是否输出操作日志
is-log: false is-log: true
tokenPrefix: Bearer tokenPrefix: Bearer
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: 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