最后我们来看看最核心的AOP处理中心是如何实现的,代码如下所示:
/**
-
切面AOP
-
@author linzhiqiang
*/
@Aspect
@Component
public class SystemLogAspect {
private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect.class);
private static final String UNKNOWN = “unknown”;
@Autowired
private LogRepository logRepository;
/**
-
1,表示在哪个类的哪个方法进行切入。配置有切入点表达式。
-
2,对有@SystemLog标记的方法,记录其执行参数及返回结果。
*/
@Pointcut(“execution(* com.minimal…controller….(…))&&@annotation(com.minimal.common.sdk.log.RequestLog)”)
public void controllerAspect() {
}
/**
- 配置controller环绕通知,使用在方法aspect()上注册的切入点
*/
@Around(“controllerAspect()”)
public Object aroundMethod(ProceedingJoinPoint point) throws Throwable {
if (logger.isDebugEnabled()) {
logger.info(“>>>>>>>>>>>>>>>进入日志切面<<<<<<<<<<<<<<<<”);
}
// 获取接口的路径地址
String methodTarget = point.getTarget().getClass().getName() + “.” + point.getSignature().getName() + “()”;
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
OperateLogPO operLogPO = new OperateLogPO();
operLogPO.setId(UUID.randomUUID().toString());
operLogPO.setMethod(methodTarget);
operLogPO.setCreateTime(new Date());
operLogPO.setIp(getClientIpAddr(request));
operLogPO.setBrownerNo(getBrownerNo(request));
operLogPO.setOsNo(getOsNo(request));
// 获取接口的请求参数
operLogPO.setParams(JsonUtils.toJson(point.getArgs()));
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
RequestLog log = method.getAnnotation(RequestLog.class);
String desc = log.operationDesc();
String module = log.module();
operLogPO.setModule(module);
operLogPO.setOperationDesc(“模块:” + module + “,操作行为:” + desc);
logger.info(“前置通知>>>>>>>>>>>>>>>操作模块:” + module + “,操作方法:” + methodTarget + “,操作行为:” + desc + “<<<<<<<<<<<<<<<<”);
Object result = null;
try {
result = point.proceed();
// 设置请求结果
operLogPO.setResult(JsonUtils.toJson(result));
// 返回通知(操作成功:1,操作失败:2)
operLogPO.setStatus(“1”);
} catch (Throwable e) {
operLogPO.setStatus(“2”);
// 异常通知
throw new RuntimeException(e);
} finally {
// 后置通知
logger.info(“后置通知>>>>>>>>>>>>>>>操作模块:” + module + “,操作方法:” + methodTarget + “,操作行为:” + desc + “,操作结果:” + operLogPO.getStatus() + “!(操作成功:1,操作失败:2)<<<<<<<<<<<<<<<<”);
logRepository.insert(operLogPO);
}
return result;
}
/**
-
功能:获取IP地址
-
@param request
-
@return
*/
public static String getClientIpAddr(HttpServletRequest request) {
String ip = request.getHeader(“x-forwarded-for”);
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader(“Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader(“WL-Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/**
-
功能:获取浏览器版本
-
@return
*/
public String getBrownerNo(HttpServletRequest request) {
return getNo(request, new String[]{“MSIE”, “FIREFOX”, “CHROME”, “SAFARI”, “OPERA”});
}
/**
-
功能:获取操作系统版本
-
@return
*/
public String getOsNo(HttpServletRequest request) {
return getNo(request, new String[]{“WINDOWS NT”, “IOS”});
}
/**
-
获取参数
-
@param request
-
@param osNos
-
@return
*/
public String getNo(HttpServletRequest request, String[] osNos) {
String userAgent = request.getHeader(“user-agent”);
String osNo = “”;
if (userAgent != null) {
String str = userAgent.toUpperCase();
for (int i = 0; i < osNos.length; i++) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
技术学习总结
学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
M0RNPR7y-1711882150824)]
[外链图片转存中…(img-Rfm48sKw-1711882150824)]
[外链图片转存中…(img-p7dTFz9z-1711882150825)]
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
[外链图片转存中…(img-XQoQUcNs-1711882150825)]
[外链图片转存中…(img-I2VSWmuV-1711882150825)]