मैं स्प्रिंग एमवीसी का उपयोग कर अपने नियंत्रक के साथ विकल्प अनुरोध को अवरुद्ध करना चाहता हूं, लेकिन इसे डिस्पैचर सर्वलेट द्वारा पकड़ा जाता है। मैं इसे कैसे प्रबंधित कर सकता हूं?स्प्रिंग एमवीसी के साथ HTTP विकल्प कैसे संभालें?
उत्तर
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
आप निर्धारित करके dispatcherServlet कॉन्फ़िगर करना चाहिए इसके dispatchOptionsRequest
true
असल में यह काम नहीं करेगा क्योंकि डिस्पैचर सर्वलेट अनुरोध को रोक देगा और यह इसे संभालेगा। इसे इसके बजाय DispatcherServlet कॉन्फ़िगर किया जाना चाहिए। मुझे इस मुद्दे के साथ बहुत दर्द था, और वर्तमान में मैंने समस्या को आंशिक रूप से हल किया। मैं समुदाय के लिए अपना समाधान पोस्ट करना चाहता था लेकिन ... क्योंकि मेरे पास 100 से कम प्रतिष्ठा स्टैकओवरफ्लो बल है, मुझे 8 घंटे इंतजार करने के लिए मजबूर करना है ताकि मुझे अपने प्रश्नों का उत्तर दे सकें। – MaVVamaldo
मैंने एक अपडेट जोड़ा – Bozho
हाँ यह समाधान है। मुझे पहले भगवान से मिलना चाहिए था, अच्छा भगवान! एक्सडी हालांकि यह एक "आंशिक" समाधान है क्योंकि डिस्पैटर सर्वलेट आपके नियंत्रक को प्रतिनिधि देने से पहले "कुछ काम" करेगा। असल में, भले ही आप "अनुमति दें" शीर्षलेख को स्पर्श नहीं करेंगे, फिर भी यह "अनुमत विधि" की सूची से भरा जाएगा। मेरे मामले में यह कोई समस्या नहीं होगी लेकिन मुझे लगता है कि यह किसी और के लिए है। – MaVVamaldo
को मैं शुरुआती के लिए 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 प्रतिक्रिया के लिए अनुमत विधि की सूची संलग्न करता है। मेरे मामले में यह महत्वपूर्ण नहीं था और मैंने बात को जाने दिया। शायद आगे की परीक्षा की जरूरत है।
लेकिन यह काम नहीं करता है, उदाहरण के लिए यदि एक हैंडलरमाइड एंडपॉइंट "/ x/y" पर पंजीकृत है। अब/x काम करने के लिए एक विकल्प-अनुरोध लेकिन/x/y इस समस्या को हल करने का कोई विकल्प नहीं है? इस विकल्प को सभी पंजीकृत अंतराल पर संभालने का अर्थ है? मैं इंटरसेप्टर के बारे में सोचता हूं लेकिन क्या कोई और तरीका है? – wrm
उपरोक्त 2 उत्तरों के त्वरित अनुपूरक के रूप में, यहां एक सर्वलेट 3 (कोई web.xml) वातावरण में dispatchOptionsRequest को सक्षम करने का तरीका बताया गया है क्योंकि मुझे गैर-एक्सएमएल में उपरोक्त उत्तरों को कैसे लागू किया जाए सेट अप।
एक वसंत 3.2/सर्वलेट 3 वातावरण में, आप DispatcherServlet
प्रारंभकर्ता वर्ग जो web.xml के जावा बराबर है के कुछ प्रकार होगा; मेरे मामले में यह AbstractAnnotationConfigDispatcherServletInitializer
है। निम्नलिखित कोड जोड़ने dispatchOptionsRequest सक्षम हो जाएगा:
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setInitParameter("dispatchOptionsRequest", "true");
}
मैं निम्नलिखित दृष्टिकोण लिया:
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 जोड़ें।
वसंत के लिए, और पॉल एडमसन उत्तर के आधार पर, मैं सिर्फ पैरामीटर dispatchOptionsRequest
true
लिए डिस्पैचर में Options
विधि कॉल संसाधित करने के लिए सेट,।
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
स्प्रिंग बूट पर उन लोगों के लिए, इस अनुवर्ती प्रश्न उपयोगी हो सकता है: http://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot – Jonik