2012-03-28 10 views
41

क्या परिभाषित किए गए कुछ को छोड़कर सभी नियंत्रकों और कार्यों में एक इंटरसेप्टर लागू करना संभव है?स्प्रिंग एमवीसी 3, कुछ परिभाषित पथों को छोड़कर सभी पर इंटरसेप्टर

बस स्पष्ट होने के लिए, मुझे परिभाषित लोगों की सूची पर एक इंटरसेप्टर लगाने में कोई दिलचस्पी नहीं है। मैं उनको बाहर करने के लिए परिभाषित करना चाहता हूं।

धन्यवाद!

उत्तर

64

स्प्रिंग 3.2 के बाद से वे टैग

mvc:exclude-mapping 

साथ कि सुविधा जोड़ी वसंत प्रलेखन से इस उदाहरण देखें:

<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> 

यहाँ डॉक

+0

ग्रेट धन्यवाद! मैं कोशिश करूँगा! – momomo

+2

सुनिश्चित करें कि xsd अंक 3.2 हो। मैंने गलत क्या पता लगाने की कोशिश कर दस मिनट बिताए। xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd \t \t http: //www.springframework। संगठन/स्कीमा/संदर्भ http://www.springframework.org/schema/context/spring-context-3.2.xsd \t \t http://www.springframework.org/schema/mvc http: //www.springframework। org/स्कीमा/MVC/वसंत-MVC-3.2.xsd "> – RuntimeException

2

एक इंटरसेप्टर को कॉन्फ़िगर करते समय, आप पथ पैटर्न निर्दिष्ट कर सकते हैं। इंटरसेप्टर केवल नियंत्रकों के लिए बुलाया जाएगा जो पथ इंटरसेप्टर पथ पैटर्न से मेल खाता है।

रेफरी: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-config-interceptor

लेकिन जैसा कि आप शायद इसे देखा, पथ प्रतिमान बहिष्कार का समर्थन नहीं करता।

तो मुझे लगता है कि इंटरसेप्टर के अंदर पथों की एक ब्लैकलिस्ट को कोड करना एकमात्र तरीका है। जब इंटरसेप्टर को बुलाया जाता है, तो HttpServletRequest.getRequestURI() पुनर्प्राप्त करें और जांचें कि पथ कालीसूचीबद्ध है या नहीं।

आप @PostConstruct इंटरसेप्टर की एनोटेटेड विधि के अंदर ब्लैकलिस्ट बना सकते हैं, और इसलिए उदाहरण के लिए एक प्रॉपर्टी फ़ाइल से ब्लैकलिस्टेड पथ प्राप्त करें।

+0

हाँ, सवाल उचित तरीके नियंत्रक और कार्रवाई नियंत्रक मैपिंग के बाद से निर्धारित करने के लिए सैद्धांतिक रूप से विभिन्न तरीकों से निर्माण किया जा सकता है हो सकता है क्या है ... वसंत जानता है क्या नियंत्रक के बाद निकाल दिया जा रहा है इंटरसेप्टर, क्योंकि हैंडलर ऑब्जेक्ट नियंत्रक उदाहरण है। ठीक से ऐसा करने के लिए इसे उसी तंत्र का उपयोग करके देखना होगा जो वसंत लक्ष्य क्रिया निर्धारित करने के लिए करता है ... कोई भी ?? :) – momomo

+0

सही नियंत्रक निर्धारित करने के लिए वसंत द्वारा उपयोग की जाने वाली तंत्र '@ requestMapping' एनोटेशन पर भरोसा करती है। तो इंटरसेप्टरों के लिए एक ही चीज़ होने का मतलब मूल रूप से '@ requestMapping' के साथ एक इंटरसेप्टर को एनोटेट करना है। लेकिन वर्तमान में यह संभव नहीं है। – tbruyelle

14

करने के लिए link हैसे जावा आधारित कॉन्फ़िगरेशन के लिए

@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/*"); 
    } 

}