Chiedendo, ho ricevuto anche un altro suggerimento significativo: cioè di fare una servlet che nel costruttore faccia questo controllo e di fare in modo che le altre servlet estendano quella.
Non mi sembra proprio un buon consiglio, se così è stato espresso.
Se il controllo viene fatto nel costruttore, allora viene fatto una volta sola, cioè quando la servlet viene instanziata, il che accade solo una volta da quando l'applicazione web viene avviata. Mentre i valori in sessione possono cambiare più volte.

Un'altra soluzione che può essere utilizzata è questa:

Costruisci una classe astratta ServletBase che estende Servlet.
Avrà:
- un metodo check(session) che effettua i controlli in sessione
- un metodo astratto do(request, response)
- il metodo service (request, response), che diventa molto semplice:

se check restituisce true, esegue il metodo do, altrimenti reindirizzerà a una pagina di errore.

Quando realizzi un tuo server estendi ServletBase ed implementi il metodo do, che in pratica "sostitiusce" il metodo service quando la sessione è ok.

Questo modo di fare risulta particolarmente utile per dotare tutte le servlet di un accesso a un database, ad esempio, invece di check avrai getConnection e il metodo do avrà come parametro anche la Connection.

Per il controllo della sessione in effetti il filter è più appropriato. Comunque anche quello appena esposto è un design-pattern di tutto rispetto, nel suo ambito di utilizzo..

Ciao