简单的 Http 请求记录到数据库
Simple Http request logging to DB
有没有办法在不使用 spring 执行器的情况下将 http 请求记录到数据库?我的程序是一个 spring 应用程序,它使用 JDBCtemplate 写入数据库。我一直看到写入控制台日志的解决方案,但我需要一些可以存储在持久数据库中的东西来充当各种审计线索。
假设您已经设置了数据库并为审计跟踪创建了 table,您可以扩展 DispatcherServlet
class 来拦截请求并将信息写入创建 table。
@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
声明替换为您的实体 class 以存储您需要的信息。对我来说,我想存储主体(因为我的应用程序使用 spring 安全性)、请求时间、响应代码、请求 URL 和请求方法。当然,您可以通过编辑 log (HttpServletRequest request, HttpServletResponse response)
方法来选择您想要 include/exclude 的内容。此外,请确保编辑查询以匹配您创建的 table 和列。希望这对您有所帮助!
有没有办法在不使用 spring 执行器的情况下将 http 请求记录到数据库?我的程序是一个 spring 应用程序,它使用 JDBCtemplate 写入数据库。我一直看到写入控制台日志的解决方案,但我需要一些可以存储在持久数据库中的东西来充当各种审计线索。
假设您已经设置了数据库并为审计跟踪创建了 table,您可以扩展 DispatcherServlet
class 来拦截请求并将信息写入创建 table。
@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
声明替换为您的实体 class 以存储您需要的信息。对我来说,我想存储主体(因为我的应用程序使用 spring 安全性)、请求时间、响应代码、请求 URL 和请求方法。当然,您可以通过编辑 log (HttpServletRequest request, HttpServletResponse response)
方法来选择您想要 include/exclude 的内容。此外,请确保编辑查询以匹配您创建的 table 和列。希望这对您有所帮助!