使用Aspect切面实现系统日志并存入数据库

2023-11-18

使用Aspect切面实现系统日志并存入数据库

1.pom.xml中:加入Maven依赖

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aspects</artifactId>
	<version>${spring.version}</version>
/dependency>

2.SpringMVC.xml中:开启切面注解

<aop:aspectj-autoproxy proxy-target-class="true" />

3.自定义注解用于切面切入点

import java.lang.annotation.*;

/**
 * 系统日志注解
 * 
 * @author wangxueqing
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

   String value() default "";
}

4.自定义切面在方法执行时自动执行

import com.alibaba.fastjson.JSON;
import com.sm.share3d.annotion.SysLog;
import com.sm.share3d.bean.SysLogEntity;
import com.sm.share3d.utils.HttpContextUtils;
import com.sm.share3d.utils.IPUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * 系统日志,切面处理类
 * 
 * @author wangxueqing
 */
@Component
@Aspect
public class SysLogAspect {

   //切入点,以方法的形式存在
   @Pointcut("@annotation(com.sm.share3d.annotion.SysLog)")
   public void sportPoint(){
      System.out.println(1111111);
   }

   @Before("sportPoint()")
   public void before(JoinPoint joinPoint){
      MethodSignature signature = (MethodSignature) joinPoint.getSignature();
      Method method = signature.getMethod();

      SysLogEntity logEntity = new SysLogEntity();
      SysLog syslog = method.getAnnotation(SysLog.class);
      if(syslog != null){
         //注解上的描述
         logEntity.setOperation(syslog.value());
      }

      //请求的方法名
      String className = joinPoint.getTarget().getClass().getName();
      String methodName = signature.getName();
      logEntity.setMethod(className + "." + methodName + "()");

      //请求的参数
      Object[] args = joinPoint.getArgs();
      if(args.length>0){
         /*String params = JSON.toJSONString(args[0]);
         logEntity.setParams(params);*/
      }


      //获取request
      HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
      //设置IP地址
      logEntity.setIp(IPUtils.getIpAddr(request));

      //用户名
//    String username = ShiroUtils.getUserEntity().getUsername();
      logEntity.setUsername(username);
      logEntity.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
      sysLogService.save(logEntity);
   }
}

5.在Controller层需要保存日志的方法上加上自定义的注解

/**
* 保存用户
* @param user
* @return
*/
@SysLog("新增用户")
@RequestMapping("/saveUser")
public R saveUser(@RequestBody User user){
    try {
	userService.save(user);
	return R.ok();
    } catch (Exception e) {
	e.printStackTrace();
        return R.error("新增失败");
    }		
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Aspect切面实现系统日志并存入数据库 的相关文章

  • Win7-64bit下MapX的安装和使用

    这两天碰到个VC MapX做飞机航迹回放与显示的单子 虽然没有接下来 今天下午还是学习了一下MapX的配置 在这留下一个记号 以备日后再用 MapX在CDSN上完整的安装包链接 http download csdn net detail f

随机推荐

  • Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous

    SASL 的认证方式包括 1 PLAIN plain是最简单的机制 但同时也是最危险的机制 因为身份证书 登录名称与密码 是以base64字符串格式通过网络 没有任何加密保护措施 因此 使用plain机制时 你可能会想要结合tls 2 DI
  • dedecms怎样调用指定id文章?

    前面我们聊了帝国cms如何调用指定id的文章到首页 作为同行的织梦cms应该也是可以实现的吧 那么 dedecms怎样调用指定id文章呢 使用idlist直接调用指定的ID这样的方法是比较好的 官方给与的说明是 idlist 提取特定文档
  • PDB符号文件与Windows下利用Windbg 分析dump

    PDB简介 跟踪提供程序 例如应用程序或驱动程序 的程序数据库 PDB 符号文件包含用于对跟踪消息设置格式的指令 以便可以按照用户可读的形式显示这些消息 跟踪消息格式设置指令属于跟踪提供程序源代码的一部分 WPP 预处理器从代码中提取这些指
  • 【Spring应用】SPEL表达式使用

    Spring框架中的SpEL Spring Expression Language Spring表达式语言 是一种基于字符串的表达式语言 用于支持在运行时动态地计算表达式的值 它可以在Spring的多个模块中使用 如Spring MVC S
  • 2023年4月计划(ue视频教程)

    虽然不跳槽 但是也面试了两家UE小公司 看看差距 一家是家装的 两个面试官问不出什么问题来 出价试用期1万五 转正后看表现 我 还不如自己学着玩 另一家是做模拟训练的 多人游戏把我问倒了 确实没学过 说明局域网的还是比较重要的 所以还要抓紧
  • Git 中的.gitignore文件的作用及配置

    文章目录 前言 一 gitignore文件是什么 二 如何配置 gitignore文件 三 gitignore文件在使用中的问题 总结 前言 在使用Git的时候 有时候会在Git的工作区目录中产生一个 gitignore文件 该篇来简单介绍
  • 微信开放平台的第三方平台微信开放平台帐号管理接口开发的两个错误

    陈永鹏的微博 陈永鹏的csdn博客地址 http blog csdn net chenyoper 陈永鹏的博客园地址 http www cnblogs com Yoperchen 开发微信开放平台下的第三方微信开放平台 好绕口吧 调用创建开
  • 远程桌面功能:从本机访问虚拟机桌面

    通过windows的远程桌面功能 实现从本机访问虚拟机桌面 一 前言 在学习本篇文章技术的同时要做好以下准备工作 1 安装VMware虚拟机 VMware12或者VMware14 2 在虚拟机上安装Windows操作系统 Windows7或
  • 【Kubernetes存储篇】持久化存储PV、PVC详解

    文章目录 一 PV PVC持久化存储理论 1 PV PVC是什么 2 PV的供应方式 3 PV PVC的回收策略 二 案例 PV PVC持久化存储案例演示 1 搭建NFS服务端 2 创建PV 并使用NFS共享存储 3 创建PVC 并和PV绑
  • 直接内存(堆外内存)

    直接内存 堆外内存 直接内存 堆外内存 指的是Java应用程序通过直接方式从操作系统中申请内存 这个差别与之前的堆 栈 方法区 那些内存都是经过了虚拟化 所以严格来说 这里是指直接内存 直接内存有哪些 使用了 Java 的 Unsafe 类
  • cmake 解决错误:Cannot specify link libraries for target

    最近研究cmake来配置Qt的编译方法 写好了CMakeLists txt通过编译后却无法链接成功 由于用的是mac osx 还以为是不同系统链接库出了问题 检查他给出的路径 变量 QT LIBRARIES 的内容 为 Volumes De
  • 敬请各位付费专栏的订阅者花点时间移步帮忙做个调查,谢谢!

    老猿有2个付费专栏 一个是使用PyQt开发图形界面Python应用 一个是moviepy音视频开发专栏 由于CSDN付费专栏订阅是不区分专栏的 老猿无法区分是因为哪个专栏得到大家认可的 因此敬请大家配合做个调查 非常感谢 大家调查回复时 根
  • openslide对.svs切成tile,并显示的记录

    仅作为记录 大佬请跳过 文章目录 直接上代码 参考 直接上代码 有 svs图和相应的python包 openslide matplotlib 后可直接运行 import openslide import matplotlib pyplot
  • 算法题记录【华为od】服务中心的最佳位置

    题目描述 思路分析 在我的理解就是查找均值 代码解析 let input1 2 input2 0 10 10 20 20 30 30 40 40 50 sum 0 res result let len input2 length input
  • 测试常见bug

    一 某公司发现 价值100元的商品 在该公司网上商城被以0 01元买走了很多 攻城狮们火速定位 问题原因很快被找到了 原来是购买商品接口的bug 该接口需要3个参数 商品id 商品单价 购买数量 而服务器根据接口传过来的商品单价 0 01元
  • 中国省份城市0-N编号

    1 中国省份0 N编号 上海 1 云南 2 内蒙古 3 北京 4 台湾 5 吉林 6 四川 7 天津 8 宁夏 9 安徽 10 山东 11 山西 12 广东 13 广西 14 新疆 15 江苏 16 江西 17 河北 18 河南 19 浙江
  • 热修复——Bugly让热修复变得如此简单

    一 简述 在上一篇 热修复 Tinker的集成与使用 中 根据Tinker官方Wiki集成了Tinker 但那仅仅只是本地集成 有一个重要的问题没有解决 那就是补丁从服务器下发到用户手机上 如果你团队中的后台开发人员实力够强 那么完全可以自
  • 蓝以中老师《高等代数》第01章:代数学的经典课题,笔记

    蓝以中老师 高等代数 第01章 代数学的经典课题 笔记 如下
  • vue 全局loading的思路和方法

    Vue 全局 loading 的实现思路一般是在 Vue 实例中添加一个 loading 组件 通过控制该组件的显示和隐藏来实现全局 loading 的效果 具体思路如下 创建一个全局的 Vue 组件 Loading 该组件用于显示 loa
  • 使用Aspect切面实现系统日志并存入数据库

    使用Aspect切面实现系统日志并存入数据库 1 pom xml中 加入Maven依赖