У меня есть REST-сервис Spring web-mvc с несколькими инициализаторами.
WebAppInitializer.java
@Order(1)
public class MyFiltersInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
FilterRegistration.Dynamic registration = servletContext.addFilter("myRequestFilter", DelegatingFilterProxy.class);
// register other filters and DispatcherServlet
}
}
SecurityWebAppInitializer.java
@Order(2)
public class MySecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
@Override
protected Set<SessionTrackingMode> getSessionTrackingModes() {
return EnumSet.of(SessionTrackingMode.COOKIE, SessionTrackingMode.URL);
}
}
Как вы можетесм. SecurityFilterChain
добавляется после всех пользовательских фильтров запросов.Мне нужно регистрировать каждый запрос и включать User
для регистрации, если запрос авторизован
Что-то вроде MyRequestFilter.java
:
@Slf4j
public class RequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(final HttpServletRequest request,
final HttpServletResponse response,
final FilterChain filterChain) throws ServletException, IOException {
MyUser user = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); //no auth yet
log.debug("request {} start, user {}", request, user);
filterChain.doFilter(request, response); //may return 401 or 403, what also need to be logged
log.debug("request {} end with response {}", request, response);
}
Есть идея добавить LogBodyHolder
, который сохраняет тело журнала до тех пор, пока SecurityChain
не будет пройден полностью, а затем вызвать log.debug
.Но есть ли симпатичный способ решить эту проблему?