1 package common.http.interceptor; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import java.io.IOException; 7 import java.lang.annotation.Annotation; 8 9 10 /** 11 * Classe astratta rappresentante un interceptor invocabile da un {@link InterceptableServlet} prima di eseguire 12 * un metodo "doGet", "doPost", "doX"... <br/> 13 * 14 * Per definire un interceptor occorre: 15 * <ul> 16 * <li>Estendere questa classe (Specificando l'annotazione a cui la nuova sottoclasse sarà associata)</li> 17 * <li>Definire il comportamento dell'interceptor sovrascrivendo i metodi {@link ServletInterceptor#handle(HttpServletRequest, HttpServletResponse, HttpServletBiConsumer)} 18 * e {@link ServletInterceptor#init(Annotation)}</li> 19 * </ul> 20 * 21 * @param <A> Il tipo di annotazione a cui l'interceptor sarà associato 22 */ 23 public abstract class ServletInterceptor<A extends Annotation>{ 24 25 26 /** 27 * Chiamato dal factory per inizializzare l'interceptor dopo averlo istanziato. 28 * @param annotation L'istanza di annotazione associata all'interceptor, con eventuali parametri necessari per la configurazione 29 */ 30 protected abstract void init (A annotation); 31 32 /** 33 * Metodo contenete la logica dell'interceptor, che si occupa di processare la richiesta e la risposta passati come parametro 34 * e di passare eventualmente il controllo eventualmente al prossimo metodo specificato come parametro 35 * @param req La richiesta da processare 36 * @param resp La risposta da processare 37 * @param next Il riferimento al metodo a cui poter passare il controllo 38 * @throws ServletException 39 * @throws IOException 40 */ 41 public abstract void handle(HttpServletRequest req, HttpServletResponse resp, HttpServletBiConsumer next) 42 throws ServletException, IOException; 43 44 /** 45 * Definisce l'ordine in cui l'interceptor deve essere eseguito rispetto agli altri interceptor. 46 * Un numero più basso implica una maggiore priorità. Il valore di default (Se il metodo non è sovrascritto) è Integer.MAX_VALUE 47 * @return La priorità dell'interceptor 48 */ 49 public int priority(){ 50 return Integer.MAX_VALUE/2; 51 } 52 }