該功能寫在子模塊Common中,其它模塊引用該模塊后在某些方法上實現對應的注解即可實現用戶操作日志的記錄
1.創建自定義注解類OperationAnnotation
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author Holley * @description 操作日志 * @create 2020-08-24 10:37 **/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface OperationAnnotation { /** * 操作內容 * @return */ String content(); }
2.實現切面通知類OperationAspect
package com.sgeye.cloud.aop; import com.sgeye.cloud.annotation.OperationAnnotation; import com.sgeye.cloud.constant.UserConstant; import com.sgeye.cloud.mapper.OperationMapper; import com.sgeye.cloud.model.JWToken; import com.sgeye.cloud.model.Operation; import com.sgeye.cloud.util.IpUtil; import com.sgeye.cloud.util.RedisUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; /** * @author Holley * @description 請輸入一句話進行描述 * @create 2020-08-24 10:58 **/ @Slf4j @Order @Aspect @Component public class OperationAspect { @Autowired private RedisUtils redisUtils; @Autowired private OperationMapper operationMapper; @After("@annotation(com.sgeye.cloud.annotation.OperationAnnotation)") public void OperationHandler(JoinPoint joinPoint){ log.info("開始記錄操作日志》》》》》》》》》》》》》"); ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Operation operation = new Operation(); operation.setIp(IpUtil.getIp(request)); // 獲取注解 MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature(); Method method = methodSignature.getMethod(); operation.setMethodName(method.getName()); operation.setClassName(method.getDeclaringClass().getName()); operation.setParams(Arrays.toString(joinPoint.getArgs())); OperationAnnotation operationAnnotation = method.getAnnotation(OperationAnnotation.class); operation.setContent(operationAnnotation.content()); String token = request.getHeader("token"); if (StringUtils.isNotEmpty(token)) { JWToken jwToken = new JWToken(); //獲取解析token中的值 HashMap<String, Object> map = jwToken.parseJWT(token); Long uid = null; String account = null; Long hid = null; if (map != null) { if (map.get("uid") != null && map.get("uid").toString() != "") { uid = Long.valueOf(map.get("uid").toString()); if(redisUtils.get(UserConstant.HOSPITAL + uid) != null){ hid = Long.valueOf((Integer)redisUtils.get(UserConstant.HOSPITAL + uid)); } } if (map.get("account") != null) { account = (String) map.get("account"); } operation.setAccount(account); operation.setHid(hid); operation.setUid(uid); } }
// 插入數據庫 operationMapper.insertOperation(operation); log.info("結束記錄操作日志》》》》》》》》》》》》》"); } }
3.在接口上添加注解OperationAnnotation
@GetMapping("/{hid}") @OperationAnnotation(content = "根據醫院hid查詢醫院詳細信息") public Object getHospitalInfo(@PathVariable("hid") Long hid, @RequestParam(name = "request_from",required = false)String requestFrom){ HospitalDto hospitalDto = hospitalService.getHospitalInfoByHid(hid); if (CommonConstant.RESQUEST_FROM_APPLET.equals(requestFrom)) { HospitalVo hospitalVo = DozerUtil.map(hospitalDto,HospitalVo.class); return hospitalVo; } HospitalOfEfileVo hospitalOfEfileVo = DozerUtil.map(hospitalDto,HospitalOfEfileVo.class); return new Response(hospitalOfEfileVo,"查詢成功"); }
參考文檔:
1.如何獲取到請求來源的真實IP:https://www.cnblogs.com/chinaifae/p/10189012.html
2.切面編程內容詳解:https://www.cnblogs.com/wangshen31/p/9379197.html