spring-boot - 简单的 Http 请求记录到数据库
问题描述
有没有办法在不使用弹簧执行器的情况下将 http 请求记录到数据库?我的程序是一个使用 JDBC 模板写入数据库的 Spring 应用程序。我不断看到写入控制台日志的解决方案,但我需要一些可以存储在持久数据库中的东西来充当各种审计跟踪。
解决方案
假设您已经设置了数据库并为审计跟踪创建了一个表,您可以扩展DispatcherServlet
该类以拦截请求并将信息写入创建的表。
@Configuration
public class LoggableDispatcherServlet extends DispatcherServlet {
@Autowired
JdbcTemplate jdbcTemplate;
@Override
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
super.doDispatch(request, response);
} finally {
log(request, response);
}
}
private void log(HttpServletRequest request, HttpServletResponse response) {
String timeStamp = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new Date());
AuditUser auditUser = new AuditUser();
auditUser.setUsername(request.getUserPrincipal().getName());
auditUser.setTimestamp(timeStamp);
auditUser.setResponseCode(response.getStatus());
auditUser.setRequestUrl(request.getRequestURI());
auditUser.setRequestMethod(request.getMethod());
jdbcTemplate.update("INSERT INTO AuditUsers (username, requestTimestamp, responseCode, requestUrl, requestMethod) VALUES " +
" (?, ?, ?, ?, ?)", auditUser.getUsername(), auditUser.getTimestamp(), auditUser.getResponseCode(),
auditUser.getRequestUrl(), auditUser.getRequestMethod());
}
}
您可以用您的实体类替换AuditUser
声明以存储您需要的信息。对我来说,我想存储主体(因为我的应用程序使用 Spring Security)、请求时间、响应代码、请求 URL 和请求方法。当然,您可以通过编辑方法来选择要包含/排除的内容log (HttpServletRequest request, HttpServletResponse response)
。此外,请确保编辑查询以匹配您创建的表和列。希望这可以帮助!
推荐阅读
- react-native - 返回到 React-Native 中的上一个组件时调用函数
- sql - 从存储过程运行时,Ntile 函数没有均匀地划分组
- postgresql - 物化视图和简单视图如何与 postgresql 中的外部数据表 (fdt) 相关联?
- excel - 在单元格中设置字符串值并避免将其误解为美国日期
- database - 无法从 IDE 连接到 postgresql 数据库,而可能从 API
- android - NTFS 分区上的 Android Studio 构建错误
- wordpress - CPT 不使用存档-{post_type}.php
- octave - 八度,错误未定义变量,未将数据数组识别为函数的输入
- c# - ModelState 错误 - Newtonsoft.Json.JsonSerializationException:无法填充列表类型 System.Net.TrackingStringDictionary
- python - Python:迭代列表范围而不复制它