middle
Какой существует эффективный способ проверить что все сервлеты доступны только для пользователя с верной сессией
Сервлетный фильтр (Filter) — наиболее эффективный способ централизованной проверки сессии для всех запросов. Фильтр перехватывает каждый запрос до того, как он достигнет сервлета, и может проверить наличие и валидность сессии.
Пример
@WebFilter("/*")
public class SessionCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) req;
HttpSession session = httpReq.getSession(false);
String uri = httpReq.getRequestURI();
if (session != null || uri.contains("/login")) {
chain.doFilter(req, resp); // пропустить дальше
} else {
((HttpServletResponse) resp).sendRedirect("/login");
}
}
}
Фильтр маппится на /* (все URL) и пропускает только запросы к странице логина и запросы с валидной сессией. Это паттерн «intercepting filter», который в Spring Security реализован через SecurityFilterChain с более гибкой конфигурацией.
На собеседовании: назовите фильтр как решение и упомяните, что в Spring Security вся аутентификация и авторизация построена на цепочке фильтров. Не нужно писать свой фильтр — Spring Security делает это лучше.