日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Spring AOP,自定义注释和反射为您的应用审核基础架构

發布時間:2023/12/3 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Spring AOP,自定义注释和反射为您的应用审核基础架构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下一篇文章將演示如何使用Spring AOP和注釋編寫簡單的審計。 審核機制將是干凈,高效且易于維護的(和Kewwl!)。

我將在用戶管理系統上演示我的示例(假設您對反射和AOP具有一般知識)。

我們從簡單的數據庫表開始,以保??存我們的審計數據:

`id`,`username``user_type``action``target_user``date``user_ip`

我們需要填充4個主要字段(用戶名,用戶類型,操作,目標用戶)

*用戶名–執行操作的用戶

* TargetUser –執行操作的目標用戶。

現在,讓我們創建新的注釋以標記我們的“想被審計”方法。 我們將非常“有創意”并使用:@AuditAble

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface Auditable { AuditingActionType actionType(); }

帶注釋的@AuditAble方法示例:

@Override@Transactional@Auditable(actionType = AuditingActionType.INTERNAL_USER_REGISTRATION)public void createInternalUser(UserDTO userDTO) {userCreationService.createInternalUserOnDB(userDTO);}

我們未來的Aspect(aop)將使用DTO從方法參數中收集一些審核數據。 在我們的情況下,將收集目標用戶名和actionType作為我們的審核信息。

為此,我創建了另一個注釋AuditingTargetUsername

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface AuditingTargetUsername { String value() default ""; }

因此,在UserDTO內部,我們得到了:

public abstract class UserDTO implements Serializable {@NotNull@AuditingTargetUsernameprivate String userName;...}

我們用@AuditingTargetUsername注釋了userName。 該信息將在以后收集。

現在,讓我們創建AOP的方面。 此處收集并執行所有審核邏輯(攔截@Auditable方法,從批注中提取信息,使用存儲庫保存最終審核記錄):

@Aspect public class AuditingAspect {....@After("@annotation(auditable)")@Transactionalpublic void logAuditActivity(JoinPoint jp, Auditable auditable) {String targetAuditingUser;String actionType = auditable.actionType().getDescription();String auditingUsername = Authentication auth = SecurityContextHolder.getContext().getAuthentication().getName()role = userService.getCurrentUser(false).getPermissionsList().toString();auditingUsernameIp = request.getRemoteAddr();}logger.info("Auditing information. auditingUsername=" + auditingUsername + ", actionType=" + actionType + ", role=" + role + ", targetAuditingUser="+ targetAuditingUser + " auditingUsernameIp=" + auditingUsernameIp);auditingRepository.save(new AuditingEntity(auditingUsername, role, actionType, targetAuditingUser, auditingUsernameIp,new Timestamp(new java.util.Date().getTime())));}

ill解釋了主要的代碼區域:

切入點–所有@ Auditable.annotations
建議–鍵入@After(我們希望在調用該方法之后進行審核)

通過帶注釋的方法的聲明檢索ActionType值:

@Auditable( actionType = AuditingActionType.INTERNAL_USER_REGISTRATION

auditingUsername是執行操作的當前用戶(在本例中為登錄用戶)。 我是通過SecurityContext(Spring Security)檢索到的。

現在,我們將通過運行時的反射來提取@targetAuditingUser字段:

targetAuditingUser = extractTargetAuditingUser(jp.getArgs()); ...public String extractTargetAuditingUserFromAnnotation(Object obj) { ...result = getTargetAuditingUserViaAnnotation(obj);...}

這就是通過反射提取帶注釋的字段的邏輯:

private String getTargetAuditingUserViaAnnotation(Object obj) { class cl=obj.getClass()String result = null;try {for (Field f : cl.getDeclaredFields())for (Annotation a : f.getAnnotations()) {if (a.annotationType() == AuditingTargetUsername.class) {f.setAccessible(true);Field annotatedFieldName = cl.getDeclaredField(f.getName());annotatedFieldName.setAccessible(true);String annotatedFieldVal = (String) annotatedFieldName.get(obj);logger.debug("Found auditing annotation. type=" + a.annotationType() + " value=" + annotatedFieldVal.toString());result = annotatedFieldVal;}}} catch (Exception e) {logger.error("Error extracting auditing annotations from obj" + obj.getClass());}return result;}

DB上的結果:

而已。 我們擁有干凈的審核基礎結構,您所需要做的就是用@Auditable注釋您的方法,并在DTO /實體內部注釋所需的待審核信息。

伊丹

翻譯自: https://www.javacodegeeks.com/2014/07/auditing-infrastructure-for-your-app-using-spring-aop-custom-annotations-and-reflection.html

總結

以上是生活随笔為你收集整理的使用Spring AOP,自定义注释和反射为您的应用审核基础架构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。