2016-03-08 12 views
9

In un'applicazione Spring Boot ho impostato un filtro con mappatura url /service1/*. Questo è stato fatto usando un FilterRegistrationBean.Spring MVC Percorso che ignora la doppia barra //

V'è anche un controller mappato al stesso modello:

@RestController @RequestMapping(path = "/service1") 
    class Service1 { 
    ... 

Il problema:

Esecuzione POST http://localhost:8080/service1/hello funziona come previsto (ossia il filtro è coinvolto nella catena di elaborazione richiesta, e il controller del servizio invocato). Tuttavia, l'esecuzione di http://localhost:8080//service1/hello (notare la doppia barra) ignorerà il filtro, ma arriverà comunque al controller a causa di Spring MVC, algoritmo di corrispondenza del percorso più lento.

Ho letto che l'algoritmo di corrispondenza del percorso del controller può essere personalizzato (collegamento: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-config-path-matching), tuttavia non trovo un'opzione per non ignorare le doppie barre.

Importante: questo comportamento indica che qualsiasi Controller protetto da un filtro (non Spring Security, ma qualsiasi filtro personalizzato) può essere ignorato semplicemente mettendo una doppia barra in qualsiasi parte dell'URL. La mia comprensione è corretta? Sapete se la corrispondenza del percorso del controller MVC può essere ottimizzata in modo che le doppie barre non vengano ignorate nell'algoritmo di corrispondenza del percorso?

+0

hai provato questo con FilterRegistrationBean.setOrder (int)? –

+0

Sembra che il problema sia nel filtro, il modo in cui l'URL è corretto non è corretto. se usi la primavera 4, controlla questo http://stackoverflow.com/a/31158112/6401364. o pubblica la configurazione del tuo filtro e possiamo aiutarti – Hani

risposta

0

Non c'è nulla che indichi il mapping Spring MVC e i filtri Servlet generici dovrebbero comportarsi allo stesso modo. La mappatura delle formiche e la mappatura servlet sono standard diversi e l'interpretazione di // potrebbe essere compressa/normalizzata o meno.

vorrei semplicemente:

A) Iscrivere il vostro filtro per /* e fare la corrispondenza nel filtro.

B) Installazione personalizzata AntPathMatcher in primavera.

C) Registrare un filtro prima del filtro che normalizza il percorso dell'URL e rifiuta di servire (HTTP 404) o reindirizzare (HTTP 301) nel percorso normalizzato in caso di GET.