0、目录结构
1、数据库创建一张日志表
CREATE TABLE sysLog(
id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,
visitTime date,
username VARCHAR2(50),
ip VARCHAR2(30),
url VARCHAR2(50),
executionTime int,
method VARCHAR2(200)
)
)
2、创建一个实体类
package cn.orz.bean;
import java.util.Date;
public class Log {
private String id;
private Date visitTime;
private String username;
private String ip;
private String url;
private Long executionTime;
private String method;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getVisitTime() {
return visitTime;
}
public void setVisitTime(Date visitTime) {
this.visitTime = visitTime;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Long getExecutionTime() {
return executionTime;
}
public void setExecutionTime(Long executionTime) {
this.executionTime = executionTime;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
@Override
public String toString() {
return "SysLog{" +
"id='" + id + '\'' +
", visitTime=" + visitTime +
", username='" + username + '\'' +
", ip='" + ip + '\'' +
", url='" + url + '\'' +
", executionTime=" + executionTime +
", method='" + method + '\'' +
'}';
}
}
3、创建AOP切面类
package cn.orz.aop;
import cn.orz.bean.Log;
import cn.orz.bean.User;
import cn.orz.controller.LogController;
import cn.orz.service.LogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
@Component
@Aspect
public class LogAop {
@Autowired
private HttpServletRequest request;
@Autowired
private LogService LogService;
private Date visitTime;//访问时间
private Class clazz;//访问的类
private Method method;//访问的方法
//主要获取访问的时间、访问的类、访问的方法
@Before("execution(* cn.orz.controller.*.*(..))")
public void doBefore(JoinPoint jp) throws NoSuchMethodException,SecurityException{
System.err.println("123");
visitTime = new Date();//访问时间
clazz = jp.getTarget().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(); //如果传递的方法参数类型为基本数据类型,一定要用它的包装类,如int 应改为Integer
}
method = clazz.getMethod(methodName,classArgs);
}
}
//后置通知
@After("execution(* cn.orz.controller.*.*(..))")
public void doAfter(JoinPoint jp) throws Exception{
System.err.println("123");
long time = new Date().getTime() - visitTime.getTime();//获取访问的时长
String url = "";
if (clazz!=null&&method!=null&&clazz!=LogAop.class&&clazz!= LogController.class){
//获取url
//获取类上的@RequestMapping(value="/**")
RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
if (classAnnotation!=null){
String[] classValue = classAnnotation.value();
//获取方法上的@RequestMapping(value="/**")
RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
if (methodAnnotation!=null){
String[] methodValue = methodAnnotation.value();
url = classValue[0]+methodValue[0];
}
}
//获取访问的ip地址
String ip= request.getRemoteAddr();
//获取当前操作的用户
User user =(User) request.getSession().getAttribute("user");
// SecurityContext context = SecurityContextHolder.getContext();//从上下文中获取当前登录的用户
// User user = (User) context.getAuthentication().getPrincipal();
Object[] objs = jp.getArgs();
System.err.println(objs.toString());
//循环输出参数
for (Object obj : objs) {
System.err.println(obj.toString());
}
//将日志相关信息封装到SysLog对象
Log sysLog = new Log();
sysLog.setExecutionTime(time);//执行时长
sysLog.setIp(ip);
sysLog.setMethod("[类名]"+clazz.getName()+"[方法名]"+method.getName());
if (user == null){
sysLog.setUsername("无登录账户");
}else {
String useremail = user.getEmail();
sysLog.setUsername(useremail);
}
sysLog.setVisitTime(visitTime);
sysLog.setUrl(url);
System.err.println(sysLog);
//调用Service完成操作
LogService.savelog(sysLog);
}
}
}
4、SpringMVC配置基于AOP切面的配置
<aop:aspectj-autoproxy proxy-target-class="true"/>
5、web.xml定义一个request监听器
<!--定义一个request监听器-->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
6、LogService类
package cn.orz.service;
import cn.orz.bean.Log;
import cn.orz.dao.LogMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class LogService {
@Autowired
private LogMapper logMapper;
public void savelog(Log sysLog) {
logMapper.savelog(sysLog);
}
}
7、LogController类
package cn.orz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "SysLog")
public class LogController {
}
8、LogMapper
package cn.orz.dao;
import cn.orz.bean.Log;
public interface LogMapper {
void savelog(Log sysLog);
}
9、LogMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 命名空间 -->
<mapper namespace="cn.orz.dao.LogMapper">
<insert id="savelog" parameterType="cn.orz.bean.Log">
insert into sysLog
values(
SYS_GUID(),
#{visitTime},
#{username},
#{ip},
#{url},
#{executionTime},
#{method})
</insert>
</mapper>