Я почти уверен, что ОП является лучшим решением (не уверен насчет наилучшей практики, но он работает отлично, и на самом деле это решение, которое я и мой руководитель проекта предпочитаю).
Кроме того, я считаю, что это может быть объединено с безопасностью Spring следующим образом:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<sec:authorize access="isAnonymous()">
<% response.sendRedirect("/myApp/login/login.action?error=false"); %>
</sec:authorize>
<sec:authorize access="isAuthenticated() and (hasRole('ADMIN') or hasRole('USER'))">
<% response.sendRedirect("/myApp/principal/principal.action"); %>
</sec:authorize>
<sec:authorize access="isAuthenticated() and hasRole('USER')">
<% response.sendRedirect("/myApp/user/userDetails.action"); %>
</sec:authorize>
Таким образом, мы не только контролируем первую страницу, являющуюся формой для входа, но и контролируем поток ПОСЛЕ , когда пользователь входит в систему, в зависимости от его роли. Работает как шарм.