1、自定義註解,定義操作類型參數和方法名參數,方法名當然也可以在切面類裏通過反射獲得,這裏以參數的形式自由填寫
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
String operationType() default "";
String requestMethodName()default "";
}
2、定義切面類,切面類裏通過獲得請求cookie來獲得訪問者信息,並最終寫入到數據庫中
@Aspect
@Component
public class OperationLogAOP {
Logger logger= LoggerFactory.getLogger(OperationLogAOP.class);
@Autowired
IOperationLogServiceImpl iOperationLogServiceImpl;
@Pointcut("@annotation(com.zte.iscp.lms.aop.OperationLog)")
private void doAspect(){}
@Before("doAspect()")
public void doBefore(JoinPoint joinPoint ) {
logger.info("方法開始執行....本次操作將會記錄操作日誌....");
}
@After("doAspect()&& @annotation(operationLog)")
public void doAfter(JoinPoint joinPoint,OperationLog operationLog) {
try {
SimpleDateFormat df = new SimpleDateFormat(SymbolConstant.DATE_FORMATE_FULL);
Calendar ca = Calendar.getInstance();
Date operDate =df.parse(df.format(ca.getTime())) ;
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
Cookie[] cookies= request.getCookies();
String userCardNo="";
OperationLogParamDTO operationLogParam=new OperationLogParamDTO();
for(Cookie co:cookies){
String cookieName=co.getName();
String cookieValue=co.getValue();
switch (cookieName){
case CookieParamConstant.UCSLOGINNAME:
userCardNo=userCardNo.equals(SymbolConstant.STRING_EMPTY)?cookieValue:userCardNo;
break;
case CookieParamConstant.ZTEDPGSSOUSER:
userCardNo=userCardNo.equals(SymbolConstant.STRING_EMPTY)?cookieValue:userCardNo;
break;
case CookieParamConstant.UCSSSOUSER:
userCardNo=userCardNo.equals(SymbolConstant.STRING_EMPTY)?cookieValue:userCardNo;
break;
case CookieParamConstant.UCSSSOACCOUNT:
userCardNo=userCardNo.equals(SymbolConstant.STRING_EMPTY)?cookieValue:userCardNo;
break;
case CookieParamConstant.PORTALSSOUSER:
userCardNo=userCardNo.equals(SymbolConstant.STRING_EMPTY)?cookieValue:userCardNo;
break;
case CookieParamConstant.COMPUTER_FNO:
operationLogParam.setComputerFno(cookieValue);
break;
case CookieParamConstant.USERNAMEEN:
operationLogParam.setUserNameEn(cookieValue);
break;
case CookieParamConstant.USERNAME:
operationLogParam.setUserName(cookieValue);
break;
case CookieParamConstant.UCSSSOLANGUAGE:
operationLogParam.setUcSssoLanguage(cookieValue);
break;
case CookieParamConstant.UDSCLIENIP:
operationLogParam.setUdsClienIp(cookieValue);
break;
case CookieParamConstant.UCSSSOTOKEN:
operationLogParam.setUcSssoToken(cookieValue);
break;
default:
break;
}
}
operationLogParam.setUserCardNo(userCardNo);
operationLogParam.setRequestDateTime(operDate);
operationLogParam.setOperationType(operationLog.operationType());
operationLogParam.setRequestMethodName(operationLog.requestMethodName());
Object[] args= joinPoint.getArgs();
//請求參數轉爲json類型的,方便查看
String requestParaJson= JSON.toJSONString(args);
operationLogParam.setRequestParamJson(requestParaJson);
//通過日誌打印出來,或者寫入到數據庫,這裏寫入到數據庫中
iOperationLogServiceImpl.saveOperationLog(operationLogParam);
}catch (Exception ex){
logger.error("error:"+ex.getMessage());
}
}
}
3、註解使用
@OperationLog(operationType = "query",requestMethodName = "queryExtrasFeeByAgreementNo(String agreementNo)" )
@ApiOperation("根據主運費協議編號查詢雜費相關信息")
@GetMapping(value = "/queryExtrasFeeByAgreementNo",produces = MediaType.APPLICATION_JSON_VALUE)
public ShippingAgreementExtrasFeeDTO queryExtrasFeeByAgreementNo(@RequestParam("agreementNo") String agreementNo)throws Exception{
return shippingAgreementService.queryExtrasFeeByAgreementNo(agreementNo);
}
4、日誌參數類
@Data
public class OperationLogParamDTO {
/**
* 操作用戶工號
*/
private String userCardNo;
/**
* 操作用戶中文名稱
*/
private String userName;
/**
* 操作用戶英文名稱
*/
private String userNameEn;
/**
* 用戶操作所在ip地址
*/
private String udsClienIp;
/**
* 用戶訪問所用系統語言
*/
private String ucSssoLanguage;
/**
* 用戶請求tocken
*/
private String ucSssoToken;
/**
* 用戶電腦號
*/
private String computerFno;
/**
* 用戶請求操作時間
*/
private Date requestDateTime;
/**
* 用戶操作類型:刪除/查詢等
*/
private String operationType;
/**
* 用戶請求方法名稱和參數名稱
*/
private String requestMethodName;
/**
* 用戶請求具體參數
*/
private String requestParamJson;
}