通过AOP和自定义注解实现请求日志收集功能,BTAJ面试有关散列(哈希)表的面试题详解

最后我们来看看最核心的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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

M0RNPR7y-1711882150824)]

[外链图片转存中…(img-Rfm48sKw-1711882150824)]

[外链图片转存中…(img-p7dTFz9z-1711882150825)]

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

[外链图片转存中…(img-XQoQUcNs-1711882150825)]

[外链图片转存中…(img-I2VSWmuV-1711882150825)]

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值