功能說明
全局日誌處理,保存請求參數和返回參數到數據庫,並且自定義註解 如下圖所示:
上代碼
首先數據庫爲:
CREATE TABLE `cl_sys_log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '操作者',
`operation` varchar(25) COLLATE utf8_bin DEFAULT NULL COMMENT '操作',
`method` varchar(55) COLLATE utf8_bin DEFAULT NULL COMMENT '方法',
`params` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '請求參數',
`ip` varchar(10) COLLATE utf8_bin DEFAULT NULL COMMENT 'ip地址',
`createdate` datetime(5) DEFAULT CURRENT_TIMESTAMP(5) ON UPDATE CURRENT_TIMESTAMP(5) COMMENT '創建時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
切面aop 代碼:
/**
* @Classname SysLogAspect
* @Description 日誌切面
* @Date 2020/6/12 14:45
* @Created by corey
*/
@Aspect
@Component
public class SysLogAspect {
private static final Logger logger = LoggerFactory.getLogger(SpringAop.class);
@Autowired
private ClSysLogService sysLogService;
//定義切點 @Pointcut
//在註解的位置切入代碼
@Pointcut("@annotation( com.itcorey.passw.MyLog)")
public void logPoinCut() {
}
//切面 配置通知
@AfterReturning("logPoinCut()")
public void saveSysLog(JoinPoint joinPoint) {
logger.info("-----------切面---------------");
//保存日誌
ClSysLog sysLog = new ClSysLog();
//從切面織入點處通過反射機制獲取織入點處的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//獲取切入點所在的方法
Method method = signature.getMethod();
//獲取操作
MyLog myLog = method.getAnnotation(MyLog.class);
if (myLog != null) {
String value = myLog.value();
sysLog.setOperation(value);//保存獲取的操作
}
//獲取請求的類名
String className = joinPoint.getTarget().getClass().getName();
//獲取請求的方法名
String methodName = method.getName();
sysLog.setMethod(className + "." + methodName);
//請求的參數
Object[] args = joinPoint.getArgs();
//將參數所在的數組轉換成json
String params = Arrays.toString(args);
String sp = "),";
String[] split = params.split("sp",1);
sysLog.setParams(JSON.toJSONString(split));
//獲取用戶名
// sysLog.setUsername(ShiroUtils.getUserEntity().getUsername());
//獲取用戶ip地址
HttpServletRequest request = HttpContextUtil.getHttpServletRequest();
sysLog.setIp(IpUtil.getRemortIP(request));
//調用service保存SysLog實體類到數據庫
sysLogService.saveLog(sysLog);
}