Spring Boot中使用AOP统一处理Web请求日志

本文介绍如何在SpringBoot项目中使用AOP统一处理Web请求日志,通过定义拦截规则,实现请求前后的日志记录,包括请求方法、路径、参数及返回结果等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Boot中使用AOP统一处理Web请求日志
—————————-这里写代码片

1.Pom.xml添加spring aop的支持已紧急AspectJ依赖

org.springframework.boot
BEH-Manager
1.4.1.RELEASE


org.aspectj
aspectjweaver


org.aspectj
aspectjrt

2.编辑拦截器代码如下
package com.bonc.manager.web.modules.audit.aspect;
import com.alibaba.fastjson.JSON;
import com.bonc.manager.web.modules.audit.entity.OperatorLog;
import com.bonc.rest.Entity.user.User;
import org.apache.http.protocol.HTTP;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Arrays;

@Aspect
@Component
public class AuditLogAop {
private Logger logger = LoggerFactory.getLogger(AuditLogAop.class);
private ThreadLocal tlocal = new ThreadLocal();
/**
* 定义拦截规则:拦截com.bonc.manager.web.modules.*.controller包下面的 所有类中,有@RequestMapping注解的方法。
*/
@Pointcut(“execution(public * com.bonc.manager.web.modules..controller...*(..))”)
public void webRequestLog() {}
/**
*收到http请求之前的处理
*/

@Before(“webRequestLog()”)
public void doBefore(JoinPoint joinPoint) {
try {

        long beginTime = System.currentTimeMillis();

        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String beanName = joinPoint.getSignature().getDeclaringTypeName();
        String methodName = joinPoint.getSignature().getName();
        String uri = request.getRequestURI();
        String remoteAddr = getIpAddr(request);
        String sessionId = request.getSession().getId();
        String user = getUserName(request);
        String method = request.getMethod();
        String params = "";
        if ("POST".equals(method)) {
           doSomeThing..            

} else {
doSomeThing..
}
logger.info(“操作请求日志记录成功doBefore()“);
} catch (Exception e) {
logger.error(“操作请求日志记录失败doBefore()“, e);
}
}
/**
*收到http请求之后的返回结果的处理
*/
@AfterReturning(returning = “result”, pointcut = “webRequestLog()”)
public void doAfterReturning(Object result) {
try {
// 处理完请求,返回内容
OperatorLog optLog = tlocal.get();
if( result != null ) {
logger.debug(result.getClass().toString());
optLog.setResult(JSON.toJSONString(result));
}
String beginTime = optLog.getRequestTime();
long requestTime = (System.currentTimeMillis() - Long.parseLong(beginTime)) / 1000;
optLog.setRequestTime(requestTime + “”);
logger.debug(“optLog.result=”+optLog.getResult());
} catch (Exception e) {
logger.error(“操作请求日志记录失败doAfterReturning()“, e);
}
}
/*
* 获取登录用户远程主机ip地址
*
* @param request
* @return
/
private String getIpAddr(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;
}
/*
* 请求参数拼装
*
* @param paramsArray
* @return
/
private String argsArrayToString(Object[] paramsArray) {
String params = “”;
if (paramsArray != null && paramsArray.length > 0) {
for (int i = 0; i < paramsArray.length; i++) {
Object jsonObj = net.sf.json.JSONObject.fromObject(paramsArray[i]);
params += jsonObj.toString() + ” “;
}
}
return params.trim();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值