SpringAOP实现操作记录的日志入库

这里是通过注解的方式实现的,也可以通过拦截器实现

import java.lang.annotation.*;

/**
 * 自定义注解类
 */
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface BrowseLog {

    String operEvent() default "";//操作简述
    String operType() default "操作日志";//日志类型
}

在这里插入图片描述
配置好切面之后下面的业务逻辑就根据自己的业务需要写就可以了

import com.alibaba.fastjson.JSONObject;
import com.mc.jewelrybespoke.app.auth.ApiToken;
import com.mc.jewelrybespoke.app.utils.LocalDateTimeUtil;
import com.mc.jewelrybespoke.entity.LoginUser;
import com.mc.jewelrybespoke.entity.OperatingLedgerTrn;
import com.mc.jewelrybespoke.service.ILoginUserService;
import com.mc.jewelrybespoke.service.INumberSettingService;
import com.mc.jewelrybespoke.service.IOperatingLedgerTrnService;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 系统日志:切面处理类
 */
@Aspect
@Component
public class SysBrowseLogAspects {

    private static final Logger logger = LoggerFactory.getLogger(SysBrowseLogAspects.class);

    @Autowired
    private IOperatingLedgerTrnService OperatingLedgerTrnService;

    @Autowired
    private ILoginUserService loginUserService;

    @Autowired
    INumberSettingService numberSettingService;

    //定义切点 @Pointcut
    //在注解的位置切入代码
    @Pointcut("@annotation(com.mc.jewelrybespoke.app.aoplog.BrowseLog)")
    public void logPoinCut() {
    }

    /*切面 配置通知,各注解作用
     *@Before:前置通知,在方法执行之前执行
     *@After:后置通知,在方法执行之后执行
     *@AfterRunning:返回通知,在方法返回结果之后执行,用这个注解参数会随方法改变,例新增一个实体,参数是一个id为null的,用这个注解后就会赋上真实的id
     *@AfterThrowing:异常通知,在方法抛出异常之后执行
     *@Around:环绕通知,围绕着方法执行   ProceedingJoinPoint  proceed() :获取返回数据 ,需要返回数据
     * */
    @Around("logPoinCut()")
    public Object saveSysLog(ProceedingJoinPoint joinPoint) throws Throwable {
        logger.info("-------------------接口日志记录----------------------");
        OperatingLedgerTrn operating = new OperatingLedgerTrn();
        //从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        System.out.println("--------signature="+signature);
        //获取切入点所在的方法
        Method method = signature.getMethod();
        System.out.println("--------method="+method);

        //获取操作--方法上的BrowseLog的值
        BrowseLog browseLog = method.getAnnotation(BrowseLog.class);
        if (browseLog != null){
            //保存操作事件
            String operEvent = browseLog.operEvent();
            operating.setOperateType(operEvent);

            //保存日志类型
            String operType = browseLog.operType();
            operating.setType(operType);
        }
        
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        //请求来源页地址
//        String referer = request.getHeader("referer");
//        operating.setPageUrl(referer);
//        System.out.println("--------referer-----------"+referer);
        // 请求方式:POST/GET
        String httpMethod = request.getMethod();
        System.out.println("---------httpMethod--------"+httpMethod);
        //操作的url
        String requestURI = request.getRequestURI();
        System.out.println("---------requestURI--------"+requestURI);
        String requestURL = request.getRequestURL().toString();
        System.out.println("---------requestURL--------"+requestURL);

        // 客户端ip
        String ip = request.getRemoteAddr();
        System.out.println("---------ip--------"+ip);

        String number = numberSettingService.getNumber("log_operating_ledger_trn", "olt_id");
         operating.setId(number);
        //操作人账号\姓名
        String username = ApiToken.getUsername();
        if (username == null || StringUtils.isBlank(username)) {
            username = request.getParameter("mobile");
        }
        System.out.println("--------------username----------------"+username);
        operating.setMemberUser(username);
        operating.setRefNo("username");


        if (username != null && StringUtils.isNotBlank(username)){
            LoginUser loginUser = loginUserService.get(username);
            Long memberInfo = loginUser.getMemberInfo().getId();
            operating.setMember(memberInfo);
            operating.setMemberUser(loginUser.getId());
        }

        //请求参数信息
        String paramter = "";

            Object[] args = joinPoint.getArgs();
            Object[] arguments = new Object[args.length];
        for (int i = 0; i < args.length; i++) {
            if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile) {
                continue;
            }

            arguments[i] = args[i];
        }
        //响应数据
        Object proceed = joinPoint.proceed();
        Map proceedMap = JSONObject.parseObject(JSONObject.toJSONString(proceed), Map.class);
        System.out.println("==================="+proceed.toString()+"======================");
        if (arguments != null){
            Map map = new HashMap();
            map.put("ip",ip);
            map.put("httpMethod",httpMethod);
            map.put("url",requestURL);
            map.put("description",arguments);
            map.put("proceed",proceedMap);
                try {
                    paramter = JSONObject.toJSONString(map);
                } catch (Exception e) {
                    paramter = map.toString().trim();
                }
            }
        System.out.println("--------paramter----------"+paramter);
            operating.setDescription(paramter);
            operating.setDate(LocalDateTimeUtil.getCurrentTime());
        OperatingLedgerTrnService.save(operating);
        return proceed;
        }
    }

之后再需要做日志处理的方法上加上定义的注解就可以了

    /**
     * 用户账号密码登陆
     * @param
     * @param
     * @return
     */
    @BrowseLog(operEvent = "用户账号密码登陆")
    @RequestMapping(value = "/appSignInPwd", method = RequestMethod.POST)
    @ResponseBody
    @ApiOperation(value = "用户账号密码登陆", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name="mobile",value = "手机号",required=true),
            @ApiImplicitParam(name="password",value = "密码",required=true)
    })
    public Result<AppLoginUserVo> appSignInPwd(@RequestParam("mobile") String mobile,@RequestParam("password") String password, HttpServletResponse response) {
        //用户名不能为空
        if(StringUtils.isBlank(mobile)){
            return new ResultUtils<AppLoginUserVo>().setErrorMsg("手机号不能为空");
        }
        //密码不能为空
        if(StringUtils.isBlank(password)){
            return new ResultUtils<AppLoginUserVo>().setErrorMsg("密码不能为空");
        }
        //用户名格式验证
        boolean mobile01 = mobile.matches(pw);

        if (mobile01 == false) {
            return new ResultUtils<AppLoginUserVo>().setErrorMsg(mobile + "手机号格式不正确!");
        }

        LoginUser user = loginUserService.get(mobile);
        if (user == null || StringUtils.isBlank(user.getId())){
            return new ResultUtils<AppLoginUserVo>().setErrorMsg("用户不存在,请先注册!!");
        }
        //MD5
        String md5= DigestUtils.md5DigestAsHex(password.getBytes());
        String md5Check =DigestUtils.md5DigestAsHex((user.getUuidSalt()+md5).getBytes());
        String passwordReal = user.getPassword();
        if (!passwordReal.equals(md5Check)){
            return new ResultUtils<AppLoginUserVo>().setErrorMsg("密码错误!!请重新输入");
        }
        String token = ApiToken.genToken(user.getMobile());
        response.setHeader("accessToken",token);
        user.setLastLoginTime(LocalDateTimeUtil.getCurrentTime());
        user = loginUserService.update(user);
        AppLoginUserVo appLoginUserVo = ForEachUtil.appSigninForEach(user);
        return new ResultUtils<AppLoginUserVo>().setData(appLoginUserVo,"恭喜 "+mobile+" 用户登陆成功!!");
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值