whycxzp
2021-04-25 8097b69572c02afbe0a210bf5b00988c76527721
增加操作日志aop,编译后字节码增加参数名
4个文件已修改
1个文件已添加
128 ■■■■■ 已修改文件
pom.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/aop/OperationLogAspect.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/OperationLog.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/LoginService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/OperationLogService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -128,6 +128,11 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <!--添加aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
    </dependencies>
    <build>
@@ -142,6 +147,15 @@
                    <mainClass>com.whyc.Application</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
        <!-- 指定资源文件的位置,否则maven打包的时候不会把文件打包进去,导致thymeleaf无法解析 -->
        <resources>
src/main/java/com/whyc/aop/OperationLogAspect.java
New file
@@ -0,0 +1,90 @@
package com.whyc.aop;
import com.whyc.service.OperationLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
/**
 * spring aop,面向切面;
 * 切面为Controller
 * 切点为本类中@PointCut的表达式
 * 具体连接点为JoinPoint
 * 通知方式选用doAfterReturning
 */
@Aspect
@Component
public class OperationLogAspect {
    @Autowired
    private OperationLogService operationLogService;
    /**
     * aop表达式解释:
     * 第一个*:返回类型,所有类型
     * 第二个*:类名,所有类名
     * 第三个*:方法名,所有方法
     * 第一个..:whyc当前包和子包
     */
    @Pointcut("execution(public * com.whyc..controller.*.add*(..)) " +
            "|| execution(public * com.whyc..controller.*.delete*(..)) " +
            "|| execution(public * com.whyc..controller.*.update*(..))")
    private void operation(){}
    @AfterReturning(pointcut = "operation()",returning = "response")
    public void doAfterReturningOperation(JoinPoint joinPoint,Object response){
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        //获取当前Session用户名
        String userName = (String) requestAttributes.getAttribute("user", RequestAttributes.SCOPE_SESSION);
        //获取当前用户ip
        String currentUserTerminalIp = request.getRemoteAddr();
        //执行的类全名
        String fullClassName = joinPoint.getSignature().getDeclaringTypeName().toString();
        //获取类型
        String[] fullClassNameSplit = fullClassName.split("\\.");
        String className = fullClassNameSplit[fullClassNameSplit.length-1].replace("Controller","模块");
        if(fullClassName.contains("app")){
            className+="-安卓端";
        }
        //执行的方法
        String methodName = joinPoint.getSignature().getName();
        String methodType = "";
        if(methodName.contains("update")){
            methodType = "更新";
        }else if(methodName.contains("add")){
            methodType ="新增";
        }else{
            methodType="删除";
        }
        //获取方法的参数
        String[] parameterNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
        Object[] args = joinPoint.getArgs();
        HashMap<String, Object> map = new HashMap<>();
        for (int i = 0; i < parameterNames.length; i++) {
            map.put(parameterNames[i],args[i]);
        }
        //拼接成操作日志内容
        String content = "执行了"+className+"的"+methodType+"操作," +
                "具体调用方法为:"+methodName+","+
                "参数信息为:"+map;
        operationLogService.record(content,userName,currentUserTerminalIp);
    }
}
src/main/java/com/whyc/pojo/OperationLog.java
@@ -10,7 +10,7 @@
@ApiModel
@Alias("OperationLog")
@TableName( schema = "`db_3.5mw_motor_web`",value = "tb_operation_log")
@TableName( schema = "`db_3.5mw_web`",value = "tb_operation_log")
public class OperationLog {
    private Integer id;
@@ -21,13 +21,13 @@
    private Date createTime;
    @ApiModelProperty("终端ip")
    private String terminalIp;
    private Integer userId;
    private String userName;
    public OperationLog(String content,String terminalIp, Integer userId) {
    public OperationLog(String content,String terminalIp, String userName) {
        this.content = content;
        this.createTime = new Date();
        this.terminalIp = terminalIp;
        this.userId = userId;
        this.userName = userName;
    }
    public Integer getId() {
@@ -62,11 +62,11 @@
        this.terminalIp = terminalIp;
    }
    public Integer getUserId() {
        return userId;
    public String getUserName() {
        return userName;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    public void setUserName(String userName) {
        this.userName = userName;
    }
}
src/main/java/com/whyc/service/LoginService.java
@@ -42,6 +42,8 @@
            //同一个账号,后面登录的,会挤掉之前登录的SessionId
            System.out.println("全局存储中当前SessionId为:"+request.getSession().getId());
            request.getServletContext().setAttribute(userName,request.getSession().getId());
            //存储当前用户
            request.getSession().setAttribute("user",userName);
            QueryWrapper<User> queryWrapper = Wrappers.query();
            queryWrapper.eq("name",userName);
            User user = userMapper.selectOne(queryWrapper);
src/main/java/com/whyc/service/OperationLogService.java
@@ -14,11 +14,11 @@
    /**
     * @param content
     * @param userId
     * @param userName
     * @param terminalIp 通过request.getRemoteAddr()获取
     */
    public void record(String content,Integer userId,String terminalIp){
        OperationLog operationLog = new OperationLog(content, terminalIp, userId);
    public void record(String content,String userName,String terminalIp){
        OperationLog operationLog = new OperationLog(content, terminalIp, userName);
        mapper.insert(operationLog);
    }
}