При разработке веб-приложений запись журналов операций пользователей является очень важной задачей. Это может помочь нам отслеживать поведение пользователей, анализировать состояние системы и проверять ее безопасность. В этой статье будет показано, как реализовать функцию записи журнала операций пользователя в среде SpringBoot.
АОП — это парадигма программирования, которая позволяет нам добавлять новые функции или изменять существующие без изменения существующего кода. В SpringBoot мы можем использовать AOP для перехвата пользовательских операций и добавления логики журналирования в перехваченный метод.
Сначала вам нужно добавить в проект зависимость Spring AOP:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Затем создайте аспектный класс для перехвата пользовательских операций и записи журналов:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class UserOperationLogAspect {
private static final Logger logger = LoggerFactory.getLogger(UserOperationLogAspect.class);
@Before("execution(* com.example.demo.controller.*.*(..))")
public void logUserOperation(JoinPoint joinPoint) {
// Получить имя метода запроса
String methodName = joinPoint.getSignature().getName();
// Получить параметры запроса
Object[] args = joinPoint.getArgs();
// Строка параметра запроса сборки
StringBuilder params = new StringBuilder();
for (Object arg : args) {
params.append(arg).append(",");
}
// регистрация
logger.info("User operation: method={}, params={}", methodName, params.toString());
}
}
В приведенном выше коде,мы используем@Before
Аннотация определяет предварительное уведомление,Он будет вызван до выполнения соответствующего метода. В этом методе,Мы получили имя метода запроса и параметры запроса.,и использоватьLogger
регистрация。
Уведомление,execution(* com.example.demo.controller.*.*(..))
Указывает на перехватcom.example.demo.controller
Все методы всех классов пакета。Вы можете настроить выражение pointcut по мере необходимости.。
Другой способ реализовать ведение журнала — использовать фильтры. Фильтры могут выполняться до того, как запрос достигнет контроллера, и, следовательно, могут использоваться для записи информации о запросе и журналов.
первый,Создать класс фильтра,выполнитьFilter
интерфейс:
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Enumeration;
public class UserOperationLogFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(UserOperationLogFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
// Получить метод запроса
String method = httpRequest.getMethod();
// Получить URL-адрес запроса
String url = httpRequest.getRequestURL().toString();
// Получить параметры запроса
Enumeration<String> parameterNames = httpRequest.getParameterNames();
StringBuilder params = new StringBuilder();
while (parameterNames.hasMoreElements()) {
String paramName = parameterNames.nextElement();
params.append(paramName).append("=").append(httpRequest.getParameter(paramName)).append(",");
}
// регистрация
logger.info("User operation: method={}, url={}, params={}", method, url, params.toString());
// Продолжить с последующими фильтрами или контроллерами.
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
Далее вам необходимо зарегистрировать фильтр в классе конфигурации SpringBoot:
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<UserOperationLogFilter> userOperationLogFilter() {
FilterRegistrationBean<UserOperationLogFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new UserOperationLogFilter());
registrationBean.addUrlPatterns("/*"); // Установите шаблон URL-адреса фильтра
return registrationBean;
}
}
В приведенном выше коде,Мы создалиUserOperationLogFilter
класс фильтра,и вdoFilter
Метод запроса иURL。Затем,существоватьFilterConfig
Используется в классе конфигурации@Bean
Фильтр регистрации аннотаций,и установитьURLРежим/*
,Указывает, что все запросы перехватываются.
В этой статье представлены два метода записи журналов пользовательских операций в SpringBoot: с использованием AOP и с использованием фильтров. Вы можете выбрать подходящий метод, исходя из реальных потребностей проекта. Независимо от того, какой подход вы выберете, главное — понять, как они работают, и настроить уровень детализации и объем ведения журналов в соответствии с вашими потребностями.