sprintboot aop切面实现记录操作日志

导入aop的包

		        <!--AOP-->
  <dependency>
        <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-aop</artifactId>
  </dependency>

1.创建自定义注解类

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = { ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Operation {
    String value() default "";
}

2.切入点操作类

pageData是我的通用实体类,你可以直接改成你自己实体类,来进行操作

sysLogService就不贴了,只有一个增加方法

import java.lang.reflect.Method;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.zyd.shiro.business.entity.User;
import com.zyd.shiro.business.service.SysLogService;
import com.zyd.shiro.util.JacksonUtil;
import com.xishuashua.xiche.utils.IpUtil;
import com.xishuashua.xiche.utils.PageData;
import com.zyd.shiro.util.SessionUtil;
//表示是一个切面类
@Aspect
@Component
public class SysLogAspect {

    @Autowired
    private SysLogService sysLogService;
    
    //定义切点 @Pointcut
    //在注解的位置切入代码
    @Pointcut("@annotation(自定义注解类的地址)")
    public void logPoinCut() {
    }
  

    //切面 配置通知
    @AfterReturning("logPoinCut()")
    public void saveSysLog(JoinPoint joinPoint) {
        //保存日志
        //改成你的实体类对象就可以了
        PageData sysLog = new PageData();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        //获取操作
        Operation operation = method.getAnnotation(Operation.class);
        if (operation != null) {
            String value = operation.value();
            sysLog.put("operation", value);
        }
        //获取请求的类名
        String className = joinPoint.getTarget().getClass().getName();
        //获取请求的方法名
        String methodName = method.getName();
        sysLog.put("method", className + "." + methodName);
        //请求的参数
        Object[] args = joinPoint.getArgs();
        //将参数所在的数组转换成json
        String params = null;
        try {
            params = JacksonUtil.obj2json(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        sysLog.put("params", params);
        //请求的时间
        sysLog.put("create_time", new Date());
        User user = SessionUtil.getUser();   
        sysLog.put("username", user.getUsername());
        sysLog.put("user_id", user.getId());
        //获取用户ip地址
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();
        sysLog.put("ip", IpUtil.getIpAdrress(request));
        //调用service保存SysLog实体类到数据库
        sysLogService.insertSysLog(sysLog);
    }

}

3.获取用户的真实ip地址



import javax.servlet.http.HttpServletRequest;

import org.springframework.util.StringUtils;

public class IpUtil {


	public static String getRealIp(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		return checkIp(ip) ? ip
				: (checkIp(ip = request.getHeader("Proxy-Client-IP")) ? ip
						: (checkIp(ip = request.getHeader("WL-Proxy-Client-IP")) ? ip : request.getRemoteAddr()));
	}


	private static boolean checkIp(String ip) {
		return !StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip);
	}
	
	

public static String getIpAdrress(HttpServletRequest request) {
 	String ip = null;

    String ipAddresses = request.getHeader("X-Forwarded-For");
    String unknown = "unknown";
    if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
        ipAddresses = request.getHeader("Proxy-Client-IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
        ipAddresses = request.getHeader("WL-Proxy-Client-IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
        ipAddresses = request.getHeader("HTTP_CLIENT_IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
        ipAddresses = request.getHeader("X-Real-IP");
    }

    if (ipAddresses != null && ipAddresses.length() != 0) {
        ip = ipAddresses.split(",")[0];
    }

    if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
        ip = request.getRemoteAddr();
    }
    return ip;
}

}

4.在方法上加上自定义的注解即可

@Operation("获取日志数据")
@RequiresPermissions("logs")
@PostMapping("/list") 
public void getAll() {

}

最后的效果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值