SSMAOP日志
- 数据库与表结构
1、日志表信息描述sysLog:
2、sql语句:
3、实体类:
- 基于AOP日志处理
1、创建切面类处理日志
@Component
@Aspect
public class LogAop {
@Autowired
private HttpServletRequest httpServletRequest; //在web.xml中配置RequestContextListener会自动注入
@Autowired
private ISysLogService sysLogService;
private Date visitTime;//开始时间
private Class clazz; //访问的类
private Method method; //访问的方法
/**
* 前置通知 主要获取开始时间,执行的是哪个类,执行的是哪一个方法
* @param jp
*/
@Before("execution(* com.itheima.controller.*.*(..))")
public void doBefore(JoinPoint jp) throws NoSuchMethodException {
visitTime=new Date(); //当前时间就是访问的时间
clazz=jp.getClass(); //具体要访问的类
String methodName=jp.getSignature().getName(); //获取访问的方法的名称
Object[] args = jp.getArgs(); //获取访问的方法的参数
//获取具体执行的方法的Method对象
if(args==null||args.length==0){
method=clazz.getMethod(methodName); //只能获取无参数的方法
}else{
Class[] classArgs=new Class[args.length];
for(int i=0;i<args.length;i++){
classArgs[i]=args[i].getClass();
}
method=clazz.getMethod(methodName,classArgs);
}
}
/**
* 后置通知
* @param jp
*/
@After("execution(* com.itheima.controller.*.*(..))")
public void doAfter(JoinPoint jp){
String url=null;
long time=new Date().getTime()-visitTime.getTime();
//获取url
if(clazz!=null&&method!=null&&clazz== LogAop.class){
//获取类上的@RequestMapping("/orders")
RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
if(classAnnotation!=null){
String[] classValue = classAnnotation.value();
//获取方法上的@RequestMapping(xxx)
RequestMapping methodAnnotation=method.getAnnotation(RequestMapping.class);
if(methodAnnotation!=null){
String[] methodValue = methodAnnotation.value();
url=classValue[0]+methodValue[0];
//获取访问的ip
String ip=httpServletRequest.getRemoteAddr();
//获取当前操作的对象
SecurityContext context= SecurityContextHolder.getContext(); //从上下文中获取当前登录的用户
User user= (User) context.getAuthentication().getPrincipal();
String username = user.getUsername();
//将日志相关信息封装到SysLog对象
SysLog sysLog=new SysLog();
sysLog.setExecutionTime(time);//执行时长
sysLog.setIp(ip);
sysLog.setMethod("[类名]"+clazz.getName()+"[方法名]"+method.getName());
sysLog.setUrl(url);
sysLog.setUsername(username);
sysLog.setVisitTime(visitTime);
sysLogService.save(sysLog);
}
}
}
}
}
2、SysLogController
3、Service
@Service
@Transactional
public class SysLogServiceImpl implements ISysLogService {
@Autowired
private ISysLogDao sysLogDao;
@Override
public void save(SysLog sysLog) {
sysLogDao.save(sysLog);
}
}
4、Dao
注意:如果日志记录记录过程中如果报错无对应的类,我们应该检查该执行方法中的参数,如果整型为int替换为对应的包装类型。