2012-03-01 25 views
23

मैं स्प्रिंग एमवीसी का उपयोग कर अपने नियंत्रक के साथ विकल्प अनुरोध को अवरुद्ध करना चाहता हूं, लेकिन इसे डिस्पैचर सर्वलेट द्वारा पकड़ा जाता है। मैं इसे कैसे प्रबंधित कर सकता हूं?स्प्रिंग एमवीसी के साथ HTTP विकल्प कैसे संभालें?

+2

स्प्रिंग बूट पर उन लोगों के लिए, इस अनुवर्ती प्रश्न उपयोगी हो सकता है: http://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot – Jonik

उत्तर

9
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS) 
public View getOptions() { 

} 

आप निर्धारित करके dispatcherServlet कॉन्फ़िगर करना चाहिए इसके dispatchOptionsRequesttrue

+0

असल में यह काम नहीं करेगा क्योंकि डिस्पैचर सर्वलेट अनुरोध को रोक देगा और यह इसे संभालेगा। इसे इसके बजाय DispatcherServlet कॉन्फ़िगर किया जाना चाहिए। मुझे इस मुद्दे के साथ बहुत दर्द था, और वर्तमान में मैंने समस्या को आंशिक रूप से हल किया। मैं समुदाय के लिए अपना समाधान पोस्ट करना चाहता था लेकिन ... क्योंकि मेरे पास 100 से कम प्रतिष्ठा स्टैकओवरफ्लो बल है, मुझे 8 घंटे इंतजार करने के लिए मजबूर करना है ताकि मुझे अपने प्रश्नों का उत्तर दे सकें। – MaVVamaldo

+0

मैंने एक अपडेट जोड़ा – Bozho

+1

हाँ यह समाधान है। मुझे पहले भगवान से मिलना चाहिए था, अच्छा भगवान! एक्सडी हालांकि यह एक "आंशिक" समाधान है क्योंकि डिस्पैटर सर्वलेट आपके नियंत्रक को प्रतिनिधि देने से पहले "कुछ काम" करेगा। असल में, भले ही आप "अनुमति दें" शीर्षलेख को स्पर्श नहीं करेंगे, फिर भी यह "अनुमत विधि" की सूची से भरा जाएगा। मेरे मामले में यह कोई समस्या नहीं होगी लेकिन मुझे लगता है कि यह किसी और के लिए है। – MaVVamaldo

30

को मैं शुरुआती के लिए Bozho जवाब देने के लिए कुछ और अधिक विस्तार गयी। कभी-कभी स्प्रिंग कंट्रोलर विकल्प विकल्प प्रबंधित करने के लिए उपयोगी होता है (उदाहरण के लिए एक AJAX कॉल करने के लिए सही "एक्सेस-कंट्रोल-अनुमति- *" शीर्षलेख सेट करने के लिए)। हालांकि, अगर आप आम बात

@Controller 
public class MyController { 

    @RequestMapping(method = RequestMethod.OPTIONS, value="/**") 
    public void manageOptions(HttpServletResponse response) 
    { 
     //do things 
    } 
} 

के बाद से DispatcherServlet ग्राहक के विकल्प अनुरोध रोकना होगा यह काम नहीं करेगा कोशिश करता है, तो।

वैकल्पिक हल बहुत सरल है:

आप करने के लिए ... अपने web.xml फ़ाइल से DispatcherServlet कॉन्फ़िगर इस प्रकार है:

... 
    <servlet> 
    <servlet-name>yourServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>dispatchOptionsRequest</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
... 

"dispatchOptionsRequest" पैरामीटर जोड़ने और सही करने के लिए इसे स्थापित कर ।

अब डिस्पैचर सर्वलेट आपके नियंत्रक को विकल्प हैंडलिंग का प्रतिनिधित्व करेगा और प्रबंधनऑप्शन() विधि निष्पादित करेगा।

उम्मीद है कि इससे मदद मिलती है।

पी एस। ईमानदार होने के लिए, मैं देखता हूं कि DispatcherServlet प्रतिक्रिया के लिए अनुमत विधि की सूची संलग्न करता है। मेरे मामले में यह महत्वपूर्ण नहीं था और मैंने बात को जाने दिया। शायद आगे की परीक्षा की जरूरत है।

+1

लेकिन यह काम नहीं करता है, उदाहरण के लिए यदि एक हैंडलरमाइड एंडपॉइंट "/ x/y" पर पंजीकृत है। अब/x काम करने के लिए एक विकल्प-अनुरोध लेकिन/x/y इस समस्या को हल करने का कोई विकल्प नहीं है? इस विकल्प को सभी पंजीकृत अंतराल पर संभालने का अर्थ है? मैं इंटरसेप्टर के बारे में सोचता हूं लेकिन क्या कोई और तरीका है? – wrm

8

उपरोक्त 2 उत्तरों के त्वरित अनुपूरक के रूप में, यहां एक सर्वलेट 3 (कोई web.xml) वातावरण में dispatchOptionsRequest को सक्षम करने का तरीका बताया गया है क्योंकि मुझे गैर-एक्सएमएल में उपरोक्त उत्तरों को कैसे लागू किया जाए सेट अप।

एक वसंत 3.2/सर्वलेट 3 वातावरण में, आप DispatcherServlet प्रारंभकर्ता वर्ग जो web.xml के जावा बराबर है के कुछ प्रकार होगा; मेरे मामले में यह AbstractAnnotationConfigDispatcherServletInitializer है। निम्नलिखित कोड जोड़ने dispatchOptionsRequest सक्षम हो जाएगा:

@Override 
    protected void customizeRegistration(Dynamic registration) { 
     registration.setInitParameter("dispatchOptionsRequest", "true"); 
    } 
3

मैं निम्नलिखित दृष्टिकोण लिया:

Maven का उपयोग करना (or manually) इस dependancy में खींच:

<dependency> 
    <groupId>com.thetransactioncompany</groupId> 
    <artifactId>cors-filter</artifactId> 
    <version>1.3.2</version> 
</dependency> 

यह सब पर कब्जा करने के एक कार्यान्वयन है इनबाउंड विकल्प अनुरोध।

<filter> 
    <filter-name>CORS</filter-name> 
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>  
    <init-param> 
     <param-name>cors.supportedHeaders</param-name> 
     <param-value>Content-Type,Accept,Origin</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>CORS</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

समस्या मैं/** दृष्टिकोण के साथ देखा है है एक अधिक विशिष्ट नियंत्रक कार्यान्वयन इस स्थान पर आ जाएगी: web.xml फ़ाइल में निम्नलिखित config जोड़ें।

0
web.xml फ़ाइल के बिना

वसंत के लिए, और पॉल एडमसन उत्तर के आधार पर, मैं सिर्फ पैरामीटर dispatchOptionsRequesttrue लिए डिस्पैचर में Options विधि कॉल संसाधित करने के लिए सेट,।

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new  DispatcherServlet(applicationContext)); 

dispatcher.setInitParameter("dispatchOptionsRequest", "true");     

dispatcher.setLoadOnStartup(1); 
dispatcher.addMapping("/*"); 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^