+ SpringAOP操作ログ記録システムにカスタムアノテーションを使用してSpringBoot2.X、

1:操作ログのカスタム注釈

/ ** 
*操作ログ注釈
* /
@Target({ElementType.TYPE、ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
パブリック@interface OperateLog {

/ **
*モジュール名
*
* @return
* /
ストリングModule1の() ;

/ *
*名操作
*
* @return
* /
文字列関数();

/ **
*フィルタ敏感語
*
* @return
* /
クラスハンドラ()デフォルトOperateLogHandler.class <OperateLogHandler延び?>;

}

 

2:動作AOPを記録

/ ** 
*操作ログAOP
* /
SLF4J @ 
@Aspect
@Component
パブリッククラスOperateLogAspect {

プライベート静的な文字列OPERATE_LOG_IDファイナル= "operateLogId";

@Autowired
プライベートSysOperateLogService sysOperateLogService;

/ **
* 接点:@Annotation "はcn.XXXX.annotation.OperateLog"注釈メソッドを保持示し通知はAOPに実行されます
* /
@Pointcut( "注釈@(cn.xiweiai.dc.web.admin.annotation.OperateLog)")
ます。public void ポイントカット() {
//
}

/ **
*事前に定義された通知
* /
@Before( " ポイントカット() ")
ジョインポイントポイント)前ます。public void {
HttpServletRequestのリクエスト= ServletRequestAttributesUtils.getHttpServletRequest()。
SysOperateLog operateLog =新しいSysOperateLog();
//组装操作日志
IF(CurrentUserUtils.isLogin()){
operateLog.setUserId(CurrentUserUtils.getCurrentUserId())。
}
OperateLog注釈= getOperateLog(点)
operateLog.setModuleName(annotation.module())。
operateLog.setFunctionName(annotation.function())。
operateLog.setReqUrl(request.getRequestURI())。
operateLog.setIp(request.getRemoteAddr())。
operateLog.setReqBody(getReqBody(点))。
operateLog.setCreateTime(新しいDate());
     //保存操作日志
sysOperateLogService.add(operateLog);
//次の使用のために準備するために、文書番号要求フィールドにログイン
request.setAttribute(OPERATE_LOG_ID、operateLog.getId());
}

/ **
*通知ポストを返します
*
* @結果PARAM
* /
@AfterReturning(ポイントカット= "ポイントカット()"、= "結果"を返す
公共無効afterReturning(結果オブジェクト){
HttpServletRequestのServletRequestAttributesUtils.getHttpServletRequest要求=();
ロングoperateLogId =(ロング)request.getAttribute(OPERATE_LOG_ID) ;
IF(operateLogId == NULL){
log.error( "operateLogId空");
を返します;
}
文字列respBody = NULL;
(もし!結果= NULL){
試み{
respBody = ObjectMapperUtils.writeValueAsString(結果);
}キャッチ(JsonParseException電子){
log.error(e.getMessage()、E)。
}
}
SysOperateLog operateLog =新しいSysOperateLog()。
operateLog.setId(operateLogId)。
operateLog.setRespBody(respBody)。
operateLog.setUpdateTime(新しいDate());

IF(CurrentUserUtils.isLogin()){
operateLog.setUserId(CurrentUserUtils.getCurrentUserId())。
}
//后置通知:更新日志
sysOperateLogService.update(operateLog)。
}

OperateLog getOperateLogプライベート(ジョインポイントポイント){
MethodSignature署名=(MethodSignature)point.getSignature()
メソッド、メソッドsignature.getMethod =();
戻りmethod.getAnnotation(OperateLog.class);
}
/ **
*パラメータ要求パラメータ取得要求ボディ取得後、空にヌルになるように、カプセル化された要求パラメータは、後続のを取得することを確実にするために使用することができます。
*
* @Paramポイント
* @return
* /
プライベート文字列getReqBody(ジョインポイントポイント){
文字列reqBody = NULL;
試み{
地図<文字列、オブジェクト>(のparams =をWebUtils.getParams);
IF(CollectionUtils.isEmpty(のparams)){
リターンNULL;
}
クラス<?OperateLogHandler> clazz = getOperateLog(点).handler()延びています。
もし(!clazz = NULL && clazz.isAssignableFrom(OperateLogHandler.class)){
。reqBody = clazz.newInstance()ハンドラ(のparams);
}他{
reqBody = ObjectMapperUtils.writeValueAsString(paramsは)。
}
}キャッチ(例外e){
log.error(e.getMessage()、E)。
}
戻りreqBody。
}
}

 

 

3:Logクラス

/**
* 系统操作日志表
* @date 2019-08-27
*/
@Data
@Entity
@Table(name = "dc_sys_operate_log")
public class SysOperateLog {

@Id
@GeneratedValue(generator = "JDBC")
private Long id;

/**
* 组织id
*/
private Long userId;

/**
* 模块名称
*/
private String moduleName;

/**
* 功能名称
*/
private String functionName;

/**
* 请求url
*/
private String reqUrl;

/**
* 登录名
*/
private String ip;

/**
* 请求body(包含url参数)
*/
private String reqBody;

/**
* 响应body
*/
private String respBody;

/**
* 密码
*/
private String detail;

/**
* 创建时间
*/
private Date createTime;

/**
* 更新时间
*/
private Date updateTime;

}

 

4:调用AOP

/**
* 系统用户控制器(成员管理)
*/
@Slf4j
@RestController
@RequestMapping(value = "/user", produces = APPLICATION_JSON_UTF8_VALUE)
public class SysUserController {

@Autowired
private SysUserService sysUserService;

/**
* 系统用户列表
*
* @param dto
* @return
*/
@OperateLog(module = "用户管理", function = "用户列表")
@RequiresPermissions(USER_LIST)
@PostMapping(value = "/list")
public DabResponse list(@Valid @RequestBody QuerySysUserListReqDTO dto) {

return success(sysUserService.getQuerySysUserListRespDTO(dto));
}

/**
* 修改用户信息
*
* @param dto
* @return
*/
@OperateLog(module = "用户管理", function = "修改用户信息")
@RequiresPermissions(USER_LIST)
@PostMapping(value = "/update")
public DabResponse update(@Valid @RequestBody SysUserUpdateDTO dto) {
sysUserService.update(dto);
return success();
}

/**
* 修改用户状态
*
* @param dto
* @return
*/
@OperateLog(module = "用户管理", function = "修改用户状态")
@RequiresPermissions(USER_LIST)
@PostMapping(value = "/update/status")
public DabResponse updateStatus(@Valid @RequestBody SysUserUpdateStatusDTO dto) {
sysUserService.updateStatus(dto);
return success();
}

}

おすすめ

転載: www.cnblogs.com/shsgshn/p/11528027.html