定义日志信息封装
用于封装需要记录的日志信息,包括操作的描述、时间、消耗时间、url、请求参数和返回结果等信息
public class WebLog {
/**
- 操作描述
*/
private String description;
/**
- 操作用户
*/
private String username;
/**
- 操作时间
*/
private Long startTime;
/**
- 消耗时间
*/
private Integer spendTime;
/**
- 根路径
*/
private String basePath;
/**
- URI
*/
private String uri;
/**
- URL
*/
private String url;
/**
- 请求类型
*/
private String method;
/**
- IP地址
*/
private String ip;
/**
- 请求参数
*/
private Object parameter;
/**
- 请求返回的结果
*/
private Object result;
//省略了getter,setter方法
}
定义注解,通过注解减少代码量
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OperationLog {
String name();//调用接口的名称
boolean intoDb() default false;//该条操作日志是否需要持久化存储
}
统一日志处理切面
@Aspect
@Component
@Order(1)
@Slf4j
public class WebLogAspect {
private static final Logger controlLog = LoggerFactory.getLogger(“tmall_control”);
@Pointcut(“execution(public * com.yee.walnut...*(…))”)
public void webLog() {
}
@Before(value = “webLog()&& @annotation(OperationLog)”)
public void doBefore(ControllerWebLog controllerWebLog) throws Throwable {
}
@AfterReturning(value = “webLog()&& @annotation(OperationLog)”, returning = “ret”)
public void doAfterReturning(Object ret, ControllerWebLog controllerWebLog) throws Throwable {
}
@Around(value = “webLog()&& @annotation(OperationLog)”)
public Object doAround(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable {
long startTime = System.currentTimeMillis();
//获取当前请求对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//记录请求信息
Object[] objs = joinPoint.getArgs();
WebLog webLog = new WebLog();
Object result = joinPoint.proceed();//返回的结果,这是一个进入方法和退出方法的一个分界
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
long endTime = System.currentTimeMillis();
String urlStr = request.getRequestURL().toString();
webLog.setBasePath(StrUtil.removeSuffix(urlStr, URLUtil.url(urlStr).getPath()));
webLog.setIp(request.getRemoteUser());
webLog.setMethod(request.getMethod());
webLog.setParameter(getParameter(method, joinPoint.getArgs()));
webLog.setResult(JSONUtil.parse(result));
webLog.setSpendTime((int) (endTime - startTime));
webLog.setStartTime(startTime);
webLog.setUri(request.getRequestURI());
webLog.setUrl(request.getRequestURL().toString());
controlLog.info(“RequestAndResponse {}”, JSONObject.toJSONString(webLog));
//必须有这个返回值。可以这样理解,Around方法之后,不再是被织入的函数返回值,而是Around函数返回值
return result;
}
/**
- 根据方法和传入的参数获取请求参数
*/
private Object getParameter(Method method, Object[] args) {
List argList = new ArrayList<>();
Parameter[] parameters = method.getParameters();
for (int i = 0; i < parameters.length; i++) {
//将RequestBody注解修饰的参数作为请求参数
RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);
if (requestBody != null) {
argList.add(args[i]);
}
//将RequestParam注解修饰的参数作为请求参数
RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class);
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
最后
最后,强调几点:
- 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
- 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
- 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
试官可能会挖你的Github项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
[外链图片转存中…(img-MWq3k5jx-1711453467460)]
[外链图片转存中…(img-9cn6RDaP-1711453467461)]
[外链图片转存中…(img-GD8m5HZa-1711453467461)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!