Spring Boot: Лучше использовать глобальные фильтры/интерсепторы только для действительно сквозных (cross-cutting) задач и избегать бизнес-логики.
Некоторые хорошие кейсы использования сквозной функциональности (cross-cutting concerns), реализуемой через фильтры и интерсепторы:
Фильтры (раньше, чем Spring MVC):
- Обработка CORS
- Кодировка (CharacterEncodingFilter)
Интерсепторы (Spring MVC):
- Проверки аутентификации/авторизации
- Замер времени выполнения запроса / метрики
- Обработка локали
- Добавление общих заголовков
Плохой пример:
@Component
public class SubscriptionInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String userId = request.getHeader("X-USER-ID");
// Бизнес-логика + обращение к БД внутри интерсептора
User user = userService.findById(userId);
if (user.getSubscription().isExpired()) {
response.setStatus(403);
response.getWriter().write("Subscription expired");
return false;
}
return true;
}
}
Java библиотека