मैं सार्वजनिक रीस्ट एपीआई बनाने के लिए प्ले 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")
}
}
}
}
}
ध्यान दें कि मैं केवल विकास मोड में इसका उपयोग करता हूं और इसमें कुछ समस्याएं हैं। उदाहरण के लिए अगर रनटाइम पर कोई अपवाद नहीं पकड़ा जाता है, तो प्रतिक्रिया में सीओआरएस हेडर नहीं होंगे क्योंकि फ़िल्टर लागू नहीं होता है। लेकिन अगर यह कॉर्डोवा एप्लिकेशन के लिए है, तो इसे पर्याप्त काम करना चाहिए।
आपका कॉर्डोवा कार्यान्वयन कोड कैसा दिखता है? – Justin
हाय, यह एक डुप्लिकेट है: http://stackoverflow.com/questions/8192159/cross-origin-get-from-local-file – Saar
@ सायर मैंने इसे आपके लिए ध्वजांकित किया :) –