pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/aop/OperationLogAspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/pojo/OperationLog.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/LoginService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/OperationLogService.java | ●●●●● 补丁 | 查看 | 原始文档 | 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); } }