JwtFilter в Spring Security
JWT-фильтр встраивается в Spring Security filter chain и проверяет токен на каждый входящий HTTP-запрос.
Базовый класс
Фильтр наследуется от OncePerRequestFilter, который гарантирует однократное выполнение на запрос (в отличие от GenericFilterBean, который может сработать повторно при forward/include).
public class JwtFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain fc) throws IOException, ServletException {
// логика фильтрации
}
}Алгоритм работы
- Извлечь токен из заголовка
Authorization(убрать префиксBearer) - Проверить валидность токена (подпись, срок действия)
- Извлечь Claims и создать объект
JwtAuthentication - Поместить объект в
SecurityContextHolder - Передать запрос дальше по цепочке фильтров
Если токен отсутствует или невалиден — фильтр просто пропускает запрос дальше. Spring Security сам вернёт 401 через AuthenticationEntryPoint, если эндпоинт требует аутентификации.
Регистрация в SecurityFilterChain
Фильтр добавляется после UsernamePasswordAuthenticationFilter:
.addFilterAfter(jwtFilter, UsernamePasswordAuthenticationFilter.class)Важные детали
- Фильтр работает на уровне Servlet filter chain, до контроллеров — поэтому
@ControllerAdviceне перехватывает исключения из фильтра - В Spring Boot 3.x используются пакеты
jakarta.servletвместоjavax.servlet - Фильтр не должен бросать исключения при невалидном токене — он просто не устанавливает Authentication
См. также
- JWT vs UserDetailsService — почему фильтр реализует Authentication напрямую
- AuthenticationEntryPoint в Spring Security — обработка 401 ошибок