2012-03-28 12 views

risposta

64

Dalla primavera del 3.2 hanno aggiunto questa caratteristica con il tag

mvc:exclude-mapping 

Vedere questo esempio dalla documentazione Primavera:

<mvc:interceptors> 
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 
<mvc:interceptor> 
    <mvc:mapping path="/**"/> 
    <mvc:exclude-mapping path="/admin/**"/> 
    <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" /> 
</mvc:interceptor> 
<mvc:interceptor> 
    <mvc:mapping path="/secure/*"/> 
    <bean class="org.example.SecurityInterceptor" /> 
</mvc:interceptor> 

Ecco il link al doc

+0

Grazie mille! Lo proverò! – momomo

+2

Assicurarsi che il xsd punti a 3.2. Ho passato dieci minuti a cercare di capire cosa c'è che non va. xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd \t \t http: //www.springframework. org/schema/contesto http://www.springframework.org/schema/context/spring-context-3.2.xsd \t \t http://www.springframework.org/schema/mvc http: //www.springframework. org/schema/MVC/primavera-MVC-3.2.xsd "> – RuntimeException

2

Durante la configurazione di un intercettore, è possibile specificare un modello di percorso. L'intercettore verrà invocato solo per i controllori il cui percorso corrisponde al modello del percorso dell'intercettore.

ref: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-config-interceptor

Ma come avrete notato che, il modello di percorso non supporta l'esclusione.

Quindi penso che l'unico modo sia di codificare una lista nera di percorsi all'interno dell'intercettore. Quando l'intercettore viene richiamato, recuperare HttpServletRequest.getRequestURI() e verificare se il percorso è in blacklist o meno.

È possibile creare la lista nera all'interno di un metodo annotato @PostConstruct dell'intercettore e quindi ottenere il percorso della lista nera da un file di proprietà, ad esempio.

+0

Sì, la questione è ciò che il modo corretto sarebbe quello di determinare il controller e l'azione dal momento che le mappature del controller può teoricamente essere accumularsi in vari modi ... la primavera sa che cosa il controllore deve essere licenziato dopo la intercettore, poiché l'oggetto gestore è l'istanza del controllore. Per fare correttamente questo si dovrebbe cercare usando lo stesso meccanismo che fa la molla per determinare l'azione del bersaglio ... nessuno ?? :) – momomo

+0

Il meccanismo utilizzato da Spring per determinare il controller corretto si basa sull'annotazione '@ RequestMapping'. Quindi avere la stessa cosa per gli intercettori significa in pratica annotare un intercettore con '@ RequestMapping'. Ma questo non è possibile al momento. – tbruyelle

14

Per la configurazione basata su java, da docs

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new LocaleInterceptor()); 
     registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**"); 
     registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*"); 
    } 

} 
Problemi correlati