2015-01-29 13 views
8

Sto cercando di fare un filtro che corrisponde del seguente URL:URL nel scintilla

/foo e /foo/*

Quindi nulla sotto /foo/ e anche il caso base /foo

ho questo filtro :

Spark.before("/foo/*", (request, response) -> { 
     String ticket = request.cookie("session"); 
     if (ticket == null) { 
      Spark.halt(302); 
     } 
    }); 

Ma naturalmente questo non viene eseguito quando entro a /foo

ho provato con la seguente, ma senza fortuna:

/foo* /foo.* /foo/

Esiste un modo per raggiungere questo obiettivo? O forse per usare una lista di URL? in modo che io possa assegnare entrambi url allo stesso filtro.

E per favore non dire a memorizzare la funzione in una variabile in modo che l'Io lo uso due volte perché penso che non è pulito a tutti ..

risposta

7

Secondo https://github.com/perwendel/spark/blob/1ecd428c8e2e5b0d1b8f221e9bf9e82429bd73bb/src/main/java/spark/route/RouteEntry.java#L31 (dove l'abbinamento percorso si svolge), non sembra che ciò che si vuole fare sia possibile.

Il codice RouteEntry divide il modello specificato e l'url specificato nel carattere "/", quindi cerca "corrispondenze" (uguaglianza o carattere jolly) per ciascuno dei componenti.

Ecco una spiegazione più dettagliata:

L'url /foo/blah ha 2 parti (nella terminologia del codice di RouteEntry linkato sopra), mentre /foo ha 1 parte. Per un modello che corrisponde al primo, deve avere 2 parti: /foo/* è l'unico che ha senso. Ma questo modello ha 2 parti, il che rende /foo fallisce i controlli if su entrambe le righe 49 e 78. L'unico caso speciale è l'hack sulla riga 71, che dovrebbe rendere il modello /foo/* corrispondente all'URL /foo/, ma non a /foo.