请求参数类
@Data
@SuperBuilder
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "UserLoginDTO对象", description = "登录对象")
public class UserLoginDTO {
private String sign;
private String appKey;
private String type;
@ApiModelProperty("用户名")
@NotBlank(message = "用户名不能为空")
@JsonProperty("imei")
@Alias("imei")
private String name;
@ApiModelProperty("密码")
@NotBlank(message = "密码不能为空")
private String pwd;
}
aop接口切面
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xxx.bean.dto.UserLoginDTO ;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Optional;
import java.util.TreeMap;
import java.util.stream.Collectors;
@Slf4j
@Aspect
@Component
public class UserAspect {
// 应改根据不同用户配置不同的appSecret
private static final String appSecret = "xxxxxxxxxxxxxxx";
@Resource
private ObjectMapper objectMapper;
@Around("execution(* com.xxx.controller.UserController.*(..))")
public Object around(ProceedingJoinPoint joinPoint) {
// 获取方法的参数
Object[] args = joinPoint.getArgs();
log.info("用户登录服务请求{}, 数据: {}", joinPoint.getSignature().getName(), JSONUtil.toJsonStr(args));
Optional<Object> optional = Arrays.stream(args)
// 过滤出接口参数UserLoginDTO
.filter(arg -> UserLoginDTO .class.isAssignableFrom(arg.getClass()))
.findFirst();
if (optional.isPresent()) {
TreeMap<String, Object> treeMap = new TreeMap<>(BeanUtil.beanToMap(optional.get()));
String sign = (String) treeMap.get("sign");
String signData = treeMap.entrySet().stream()
.filter(entry -> ObjUtil.isNotNull(entry.getValue()) && !"sign".equals(entry.getKey()))
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.joining("&")) + appSecret;
if (!SecureUtil.md5(signData).equals(sign)) {
log.error("用户登录请求数据验签失败, {}", JSONUtil.toJsonStr(treeMap));
// throw new BizException("请求数据验签失败");
}
}
try {
Object result = joinPoint.proceed();
// objectMapper.writeValueAsString(result)将给定的 Java 对象 result 转换为 JSON 格式的字符串 ObjectMapper 是 Jackson 库中的核心类之一,用于在 Java 对象与 JSON 数据之间进行序列化(Object → JSON)和反序列化(JSON → Object)操作
log.info("用户登录服务响应{}, 数据: {}", joinPoint.getSignature().getName(), objectMapper.writeValueAsString(result));
return result;
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}
接口
@Api(tags = "用户")
@Slf4j
@RestController
public class UserController {
@PostMapping("user/login")
public Object login(@Validated UserLoginDTO dto) {
log.info("请求参数,{}", JSONUtil.toJsonStr(dto));
// ........
}
}