2015-01-29 22 views
8

Próbuję zrobić filtr, który pasuje do następujących adresów URL:URL Deseń w iskrą

/foo i /foo/*

Więc coś pod /foo/ a także w przypadku podstawa /foo

Mam ten filtr :

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

Ale oczywiście tego nie wykona, gdy wchodzę do /foo

Próbowałem z następujących, ale bez powodzenia:

/foo* /foo.* /foo/

Czy mimo to osiągnąć? A może użyć listę URL? tak, że można przypisać zarówno URL do samego filtra.

I proszę nie mówić, aby zapisać w zmiennej funkcji tak, że używam go dwa razy, ponieważ myślę, że nie jest czysty w ogóle ..

Odpowiedz

7

Według https://github.com/perwendel/spark/blob/1ecd428c8e2e5b0d1b8f221e9bf9e82429bd73bb/src/main/java/spark/route/RouteEntry.java#L31 (gdzie odbywa dopasowanie ścieżki), to nie wygląda na to, co chcesz zrobić, to możliwe.

Kod RouteEntry dzieli dany wzorzec i podany adres URL znakiem "/", a następnie wyszukuje "dopasowania" (równość lub symbol wieloznaczny) dla każdego komponentu.

Oto bardziej szczegółowe wyjaśnienie:

Adres URL /foo/blah ma 2 części (w terminologii związanej z kodem RouteEntry powyżej), natomiast /foo posiada 1 udział. Na wzór dopasować pierwsze, musi mieć 2 części: /foo/* jest jedynym, który ma sens. Ale ten wzór ma 2 części, co sprawia /foo nie if sprawdza, na obu liniach 49 i 78. tylko szczególny przypadek jest hack na linii 71, który powinien sprawić, że wzór /foo/* mecz url /foo/, ale nie /foo.