面向切面的自定義註解實現接口訪問日誌記錄

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;
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章