java - 审核API请求/接口方法的机制/技术
问题描述
在我的 Web-API 中,我在接口级别声明了各种方法。每个方法的实现都是在服务级别编写的。在声明的每个方法中,我都添加了审计注释,就像这样
CreateStackResponse createStack(@AuditId("id") String id, @AuditModule("module") String module, CreateStackRequest createStackRequest)
我的审计表列是:id、context-id、message、details、user-id、module、submodule、...
我如何构建一条消息(例如“创建堆栈请求由 abc 用户发起”)来存储。一种解决方案就像在服务级别,我将调用一种方法(比如 logEvent(必需参数)),它将审计存储在数据库中。我们可以在接口级别使用简单的注释来做到这一点吗?例如,我如何保存审计日志,如 aws elastic beanstalk 的事件选项卡中所示。
解决方案
注释本身并不为您的代码提供任何行为。所有这些注释都是它们的名字所暗示的......附加到您的代码的额外信息。当您的代码在运行时使用自省来查看已编译代码的定义并基于这些注释执行操作时,注释的力量就会出现。
Spring 框架广泛地做到了这一点。它查看代码上的注释并使用它们来决定如何连接您的应用程序。它通常会围绕您自己的类创建包装类,以便它可以在您的代码之上注入自己的逻辑。
你当然可以自己做这样的事情,但这不是微不足道的。我建议查看 AspectJ 或其他一些面向方面的编程 (AOP)框架。我建议总体上研究面向方面编程的想法,因为您想要做的是它看起来要解决的最常见问题之一。使用 Spring 框架也可以很好地解决此类问题。它包括一个用于执行 AOP 的模块,“Spring AOP”。
无论您如何使用注释来解决此问题,您都在谈论大量学习并可能重组您的代码以使用第三方包。您可能很想放弃使用注释的想法,而只是将简单的日志记录代码放入您的主要逻辑中。
我刚刚在 Google 上搜索“使用面向方面的编程进行审计”并获得了很多有趣的结果。这是一个这样的打击。我不知道它是否是最适合您的资源,但它会让您了解我在这里谈论的内容:
推荐阅读
- git - Jenkins 与 Git 存储库的集成
- python - 从/向 InfluxDB 读取和写入
- jquery - 加载时自动下拉 davidstutz bootstrap multiselect
- typescript - rematch/core 中的状态没有被记录
- azure - DevOps Pipeline 中的 Azure 应用服务问题
- javascript - 反应 | 在组件外调用函数
- python - 比较两列并删除相同的行
- android - Android,Okhttp - 如何将子协议添加到 websocket 连接
- python-3.x - 如何检测 IME 的语言
- php - 根据来自多个表的标签显示数据