Gymterview
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 делает это лучше.