springAop记录操作日志

1.正常业务的controller中接口添加name,用户描述接口信息,让我们知道进入了什么接口,做什么,也就是需要拦截的接口

@RequestMapping(value = "/list",name ="查询所有企业数据")
    public String findAll(@RequestParam(defaultValue = "1",name = "page") int pageNum,@RequestParam(defaultValue = "2") int pageSize){
//        List<Company> companyList = companyService.findAll();
//        PageBean pageBean = companyService.findPage(pageNum,pageSize);
        PageInfo<Company> pageBean = companyService.findPage(pageNum,pageSize);

        request.setAttribute("page",pageBean);
        return "company/company-list";
    }

2.日志对外只有一个查询的controller接口

@Controller
@RequestMapping("/system/log")
public class SysLogController extends BaseController {
    @Autowired
    private SysLogService sysLogService;

    @RequestMapping(value = "/list",name ="查询所有日志数据")
    public String findAll(@RequestParam(defaultValue = "1",name = "page") int pageNum,@RequestParam(defaultValue = "10") int pageSize){
//        当前登录人所属部门的id
        PageInfo<SysLog> pageBean = sysLogService.findPage(getCompanyId(),pageNum,pageSize);
        request.setAttribute("page",pageBean);
        return "system/log/log-list";
    }
}

3.日志实体类,用户记录日志保存的信息

@Data
public class SysLog implements Serializable {
    private String id;
    private String userName;
    private String ip;
    private Date time;     //操作时间
    private String method; //方法名称  findAll  toAdd  toUpdate  delete
    private String action; //方法名称的中文解释 这个值取自方法上RequestMapping注解的name值
    private String companyId;
    private String companyName;
}

4.提供两个日志的方法,① 储存②查询 ,不需要修改和删除
4.1service接口

public interface SysLogService {
    //根据公司id和分页信息查询日志信息
    public PageInfo<SysLog> findPage(String companyId,int page,int size);

    public void save(SysLog sysLog);

}

4.2serviceImpl接口实现类

@Service
public class SysLogServiceImpl implements SysLogService {

    @Autowired
    private SysLogDao sysLogDao;

	//查询日志信息
    @Override
    public PageInfo<SysLog> findPage(String companyId,int page,int size) {
        PageHelper.startPage(page,size);
        List<SysLog> list = sysLogDao.findAll(companyId);
        return new PageInfo<SysLog>(list,5);
    }

	//保存日志信息
    @Override
    public void save(SysLog sysLog) {
        sysLogDao.save(sysLog);
    }
}

4.3dao接口

public interface SysLogDao {

    //查询全部
    List<SysLog> findAll(String companyId);
    //添加
    void save(SysLog log);

}

4.4dao的xml映射 sql语句

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN">

-<mapper namespace="cn.itcast.dao.system.SysLogDao">

//数据字段入属性不一致,进行映射
-<resultMap type="cn.itcast.domain.system.SysLog" id="BaseResultMap">

<id property="id" column="id"/>

<result property="userName" column="user_name"/>

<result property="ip" column="ip"/>

<result property="time" column="time"/>

<result property="method" column="method"/>

<result property="action" column="action"/>

<result property="companyId" column="company_id"/>

<result property="companyName" column="company_name"/>

</resultMap>

<!--查询全部-->
<select id="findAll" resultMap="BaseResultMap" parameterType="string">select * from st_sys_log where company_id=#{companyId} order by time desc </select>

<!--添加-->
<insert id="save" parameterType="cn.itcast.domain.system.SysLog">insert into st_sys_log (id, user_name, ip, time, method, action,company_id,company_name)values (#{id}, #{userName}, #{ip}, #{time}, #{method},#{action},#{companyId},#{companyName}) </insert>

</mapper>

5.springAop日志实现介绍
在这里插入图片描述在这里插入图片描述
6.定义切面类,使用@Around环绕通知,记录操作日志

@Component
@Aspect
public class LogAspect {

    @Autowired
    private SysLogService sysLogService;

    @Autowired
    private HttpSession session;

    @Autowired
    private HttpServletRequest request;

    @Around("execution(* cn.itcast.controller.*.*.*(..))")
    public Object saveLog(ProceedingJoinPoint pjp) throws Throwable {
        SysLog sysLog = new SysLog();

//        可以直接赋值的属性:
        sysLog.setId(UUID.randomUUID().toString());
        sysLog.setTime(new Date());
//        跟当前登录人有关系的属性:
        User user = (User) session.getAttribute("loginUser");
        if(user!=null){
            sysLog.setUserName(user.getUserName());
            sysLog.setCompanyId(user.getCompanyId());
            sysLog.setCompanyName(user.getCompanyName());
            sysLog.setIp(request.getRemoteAddr());  // ip地址
        }

//        取值比较复杂的属性:
        MethodSignature signature = (MethodSignature) pjp.getSignature();  // 方法签名中具有方法和注解的相关内容
        Method method = signature.getMethod(); // 从method方法对象中获取方法名称
        String name = method.getName();
        sysLog.setMethod(name); //方法名


        // 请求的方法参数值
        Object[] args = joinPoint.getArgs();
        // 请求的方法参数名称
        LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
        String[] paramNames = u.getParameterNames(method);
        if (args != null && paramNames != null)
        {
            String params = "";
            for (int i = 0; i < args.length; i++) {
                params += "  " + paramNames[i] + ": " + args[i];
            }
        }


//        判断方法上是否有RequestMapping注解
        if(method.isAnnotationPresent(RequestMapping.class)){
          RequestMapping annotation = method.getAnnotation(RequestMapping.class); //从方法中获取RequestMapping注解对象
          String action = annotation.name();  // 获取注解上的name属性值
          sysLog.setAction(action); //从方法注解上去name属性
        }
        sysLogService.save(sysLog);
        return pjp.proceed();//执行原方法
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值