2015-09-10 9 views
10

मैं सार्वजनिक रीस्ट एपीआई बनाने के लिए प्ले 2.4 का उपयोग कर रहा हूं। मैंने सीओआरएस फ़िल्टर को सभी मूल और हेडर की अनुमति दी।प्ले करें! 2.4: मूल फ़ाइल से सीओआरएस को कैसे अनुमति दें: //

application.conf से देखें:

play.filters { 
    # CORS filter configuration 
    cors { 

    # The path prefixes to filter. 
    pathPrefixes = ["/"] 

    # The allowed origins. If null, all origins are allowed. 
    allowedOrigins = null 

    # The allowed HTTP methods. If null, all methods are allowed 
    allowedHttpMethods = null 

    # The allowed HTTP headers. If null, all headers are allowed. 
    allowedHttpHeaders = null 

    # The exposed headers 
    exposedHeaders = [] 

    # Whether to support credentials 
    supportsCredentials = true 

    # The maximum amount of time the CORS meta data should be cached by the client 
    preflightMaxAge = 1 hour 
    } 
} 

यह पूरी तरह से ठीक काम करता है जब मैं एक क्लासिक ब्राउज़र (क्रोम/फ़ायरफ़ॉक्स का परीक्षण) से एपीआई फोन, मूल की परवाह किए बिना के रूप में मैं सभी की अनुमति दी।

लेकिन जब मैंने उसे एक कॉर्डोबा आवेदन फार्म कॉल करने के लिए कोशिश (कॉर्डोबा क्षुधा में, ajax अनुरोध के मूल file:// कर रहे हैं), मैं एक CORS त्रुटि मिलती है: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'file://' is therefore not allowed access. The response had HTTP status code 403। जैसे कि मैंने मूल 'फ़ाइल' की अनुमति नहीं दी: // '

मैंने एक और एपीआई उपभोग करने की कोशिश की जो सीओआरएस (https://public.opencpu.org/ocpu/library/ प्राप्त करें) को जांचने के लिए अनुमति देता है कि यह कॉर्डोवा नहीं था, जिसने अनुरोध को अवरुद्ध कर दिया था लेकिन यह ठीक काम करता था। तो मुझे लगता है कि समस्या प्ले से आता है।

मैं allowedOrigins = ["file://"] स्थापित करने के लिए कोशिश की, लेकिन यह या तो काम नहीं करता है ...

किसी भी मदद कृपया?

संपादित करें: यह Cross origin GET from local file:// का डुप्लिकेट नहीं है: मैं एक वेबसर्वर स्थापित नहीं कर सकता क्योंकि यह एक कॉर्डोवा एप्लिकेशन है। फ़ाइलों को फोन/टैबलेट फ़ाइल सिस्टम से वेबव्यू में परोसा जाता है। यह एक प्ले फ्रेमवर्क विशिष्ट प्रश्न है, मुझे पुराने संस्करण के साथ कोई समस्या नहीं थी। हो सकता है कि मूल फ़ाइल को अनुमति देने के लिए डिफ़ॉल्ट CorsFilter को संशोधित किया जा सके: //

संपादित करें 2: अनुरोध करने के बाद, यहां मेरे कस्टम स्कैला फ़िल्टर के लिए उपयोग किया जाने वाला (बहुत सरल) कोड है।

// CORSFilter.scala 
package filters 
import play.api.libs.concurrent.Execution.Implicits.defaultContext 
import play.api.mvc._ 
import play.mvc.Http 

/** 
    * Allow CORS from anywhere, any method 
    */ 
class CORSFilter extends EssentialFilter { 
    def apply(nextFilter: EssentialAction) = new EssentialAction { 
    def apply(requestHeader: RequestHeader) = { 
     nextFilter(requestHeader) 
      .map { result => 
      if (requestHeader.method.equals("OPTIONS")) { 
       Results.Ok.withHeaders(
       Http.HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN -> "*", 
       Http.HeaderNames.ACCESS_CONTROL_ALLOW_HEADERS -> "X-Requested-With, Accept, Content-Type", 
       Http.HeaderNames.ACCESS_CONTROL_ALLOW_METHODS -> "HEAD,GET,POST,PUT,PATCH,DELETE") 
      } else { 
       result.withHeaders(
       Http.HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN -> "*", 
       Http.HeaderNames.ACCESS_CONTROL_ALLOW_HEADERS -> "X-Requested-With, Accept, Content-Type", 
       Http.HeaderNames.ACCESS_CONTROL_ALLOW_METHODS -> "HEAD,GET,POST,PUT,PATCH,DELETE", 
       Http.HeaderNames.ACCESS_CONTROL_EXPOSE_HEADERS -> "X-Custom-Header-To-Expose") 
      } 
      } 
    } 
    } 
} 

ध्यान दें कि मैं केवल विकास मोड में इसका उपयोग करता हूं और इसमें कुछ समस्याएं हैं। उदाहरण के लिए अगर रनटाइम पर कोई अपवाद नहीं पकड़ा जाता है, तो प्रतिक्रिया में सीओआरएस हेडर नहीं होंगे क्योंकि फ़िल्टर लागू नहीं होता है। लेकिन अगर यह कॉर्डोवा एप्लिकेशन के लिए है, तो इसे पर्याप्त काम करना चाहिए।

+0

आपका कॉर्डोवा कार्यान्वयन कोड कैसा दिखता है? – Justin

+1

हाय, यह एक डुप्लिकेट है: http://stackoverflow.com/questions/8192159/cross-origin-get-from-local-file – Saar

+0

@ सायर मैंने इसे आपके लिए ध्वजांकित किया :) –

उत्तर

10

ठीक है, समस्या प्ले ढांचे में कोड की इस पंक्ति से आता है: https://github.com/playframework/playframework/blob/master/framework/src/play-filters-helpers/src/main/scala/play/filters/cors/AbstractCORSPolicy.scala#L322

यूआरआई के रूप में 'फ़ाइल: //' है, यूआरआई के डोमेन/मेजबान रिक्त है तो new URI एक त्रुटि फेंकता है और फिर प्ले 403 त्रुटि देता है। इसे ठीक करने के लिए हमें ढांचे को पैच करने की आवश्यकता है या मूल को 'फ़ाइल: //' में बदलने की कोशिश करें।

मुझे अपने उपयोग के मामले के लिए एक समाधान मिला: Play पर CORS अक्षम करें। फिर जब मैं अपने कॉर्डोवा ऐप से AJAX का उपयोग करता हूं, तो मूल की जांच नहीं की जाती है।

इस कामकाज के साथ समस्या यह है कि यदि मैं किसी भी कारण से अपने प्ले प्रोजेक्ट पर सीओआरएस सक्षम करना चाहता हूं, तो कॉर्डोवा ऐप काम नहीं करेगा क्योंकि Play मूल की जांच करेगा और इसे अस्वीकार कर देगा।

+0

लगता है मैंने ट्रैक करने के लिए https://github.com/playframework/playframework/issues/5193 बनाया है। –

+0

क्या आप कृपया बता सकते हैं कि आप सीओआरएस को कैसे अक्षम करते हैं? – Simon

+1

वैसे मैंने प्ले फ़िल्टर [कॉर्सफिल्टर] (https://www.playframework.com/documentation/2.4.x/CorsFilter) को सक्षम किया था। जब मुझे अपने कॉर्डोवा ऐप के काम करने की आवश्यकता नहीं थी, तो मैंने इसे हटा दिया। समस्या यह थी कि यदि मैंने ब्राउज़र पर अपने कॉर्डोवा ऐप का परीक्षण किया, तो मैंने क्रोम में क्रॉस डोमेन सुरक्षा को अक्षम नहीं किया है, तो मुझे CORS त्रुटियां थीं। तो बाद में मैंने अपना खुद का कॉर्सफ़िल्टर बनाया जो बिना किसी चेक के हर अनुरोध के लिए आवश्यक शीर्षलेख जोड़ता है। – SebT

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