简单的 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 和列。希望这对您有所帮助!