首页 > 解决方案 > 简单的 Http 请求记录到数据库

问题描述

有没有办法在不使用弹簧执行器的情况下将 http 请求记录到数据库?我的程序是一个使用 JDBC 模板写入数据库的 Spring 应用程序。我不断看到写入控制台日志的解决方案,但我需要一些可以存储在持久数据库中的东西来充当各种审计跟踪。

标签: spring-bootjdbctemplateaudit-trail

解决方案


假设您已经设置了数据库并为审计跟踪创建了一个表,您可以扩展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)。此外,请确保编辑查询以匹配您创建的表和列。希望这可以帮助!


推荐阅读