2015-04-11 10 views
11

मैं सर्वर पक्ष में Grails का उपयोग कर क्रॉस मूल संचार करना चाहता हूं। केवल प्रलेखन कि मैंने पाया यह एकGrails में CORS को सक्षम करने के लिए 3.0.1

https://grails.org/plugin/cors

है, लेकिन यह Grails के एक पुराने संस्करण के लिए है। अन्य प्रलेखन कि मैंने पाया वसंत के लिए है:

https://spring.io/guides/gs/rest-service-cors/

तो मैं init/myproject/ फ़ोल्डर में फ़ाइल SimpleCorsFilter.groovy जोड़ा है, लेकिन मैं नहीं जानता कि resources.groovy

उत्तर

7

विशिष्ट होने के लिए, यहां कुछ कोड है जो काम करता है। सूचना इंटरसेप्टर नाम अपने नियंत्रक का नाम (यहाँ, workRequest) से मेल खाना चाहिए, डोमेन जो कुछ भी आप से बुला रहे हैं (यहाँ, स्थानीय होस्ट: 8081) होने की जरूरत है और यह विधि से पहले() आप चाहते हैं:

package rest 
class WorkRequestInterceptor { 
boolean before() { 
    header("Access-Control-Allow-Origin", "http://localhost:8081") 
    header("Access-Control-Allow-Credentials", "true") 
    header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE") 
    header("Access-Control-Max-Age", "3600") 
    true 
} 

boolean after() { true } 
} 
2

आप grails का उपयोग करना चाहिए में इस घटक तार करने के लिए कैसे 3 की नई इंटरसेप्टर एपीआई। (https://grails.github.io/grails-doc/3.0.x/guide/single.html#interceptors)

आप grails create-interceptor कमांड के साथ एक इंटरसेप्टर बना सकते हैं। एक कॉरस इंटरसेप्टर के लिए मैं इस इंटरसेप्टर की after() विधि का उपयोग करूंगा, और सभी अनुरोधों (या केवल आपके अनुरोधों के अनुरूप) से मेल खाता हूं। आप इस विधि में response ऑब्जेक्ट का उपयोग कर सकते हैं, इसलिए हेडर सेट करना स्प्रिंग दस्तावेज़ में वर्णित मामले के समान होना चाहिए।

11

हम इस समस्या को हल करने के लिए resources.groovy में एक प्रविष्टि के साथ एक सामान्य सर्वलेट फिल्टर का प्रयोग किया:

public class CorsFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) 
      throws ServletException, IOException { 

     String origin = req.getHeader("Origin"); 

     boolean options = "OPTIONS".equals(req.getMethod()); 
     if (options) { 
      if (origin == null) return; 
      resp.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with"); 
      resp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS"); 
      resp.addHeader("Access-Control-Max-Age", "3600"); 
     } 

     resp.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin); 
     resp.addHeader("Access-Control-Allow-Credentials", "true"); 

     if (!options) chain.doFilter(req, resp); 
    } 
} 

resources.groovy:

beans = { 
    corsFilter(CorsFilter) 
} 

यह बुनियादी authenticatio का उपयोग कर CORS अनुरोध के साथ काम करता है एन। मैंने Grails 2.x प्लगइन लिखा और यह Grails के साथ काम करने के लिए यह आसान लग रहा था 3.

+0

यह मेरे लिए काम नहीं कर रहा था। मैं Grails 2.5.4 का उपयोग कर रहा हूं, और src/groovy में 'corsFilter' वर्ग बना रहा हूं और फिर ** resource.groovy ** में बीन को परिभाषित कर रहा हूं ** फ़िल्टर को तार नहीं मिला। –

+0

कोई बात नहीं। मैंने टिप्पणी को गलत समझा। ऐसा लगता है कि Grails 2.x प्लगइन का उपयोग करना मेरे लिए काम कर रहा है: https://github.com/davidtinker/grails-cors धन्यवाद डेविड! –

5

मैं कोरस मुद्दे द्वारा मारा गया था जब मैं Grails 3.0 आराम आवेदन के साथ emberjs ढांचे के साथ खेल रहा था। इस आलेख में दिए गए चरणों के बाद http://www.greggbolinger.com/rendering-json-in-grails-for-ember-js/ ने मुझे आगे बढ़ने में मदद की।

आलेख दिखाता है कि आप कॉर्स इंटेसेप्टर क्लास बनाने के लिए नए इंटरसेप्टर का उपयोग कैसे कर सकते हैं जो सही शीर्षलेख सेट करता है।

class CorsInterceptor { 

    CorsInterceptor() { 
    matchAll() 
    } 

    boolean before() { 
    header("Access-Control-Allow-Origin", "http://localhost:4200") 
    header("Access-Control-Allow-Credentials", "true") 
    header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE") 
    header("Access-Control-Max-Age", "3600") 
    true 
    } 

    boolean after() { true } 
} 

यह जीईटी अनुरोधों के लिए अपेक्षित के रूप में काम करता था, लेकिन POST और PUT अनुरोधों के लिए विफल रहा। इसका कारण यह था कि एक विकल्प प्रीफलाइट अनुरोध पहले http://localhost:8080/mycontroller/1234 पर भेजा गया था, जो मेरे मामले में 404 को नहीं मिला था।

इस जवाब https://stackoverflow.com/a/31834551 की मदद से मैं इस के बजाय करने के लिए CorsInterceptor वर्ग संशोधित:

class CorsInterceptor { 

    CorsInterceptor() { 
    matchAll() 
    } 

    boolean before() { 
    header("Access-Control-Allow-Origin", "http://localhost:4200") 
    boolean options = ("OPTIONS" == request.method) 
    if (options) { 

     header("Access-Control-Allow-Origin", "http://localhost:4200") 
     header("Access-Control-Allow-Credentials", "true") 
     header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE") 
     header("Access-Control-Max-Age", "3600") 

     response.status = 200 
    } 

    true 
    } 

    boolean after() { true } 

} 

अब पोस्ट और डाल अनुरोध काम कर रहे थे।

1

grails 3.1 के लिए सबसे स्वच्छ और सरल समाधान।एक्स मैंने पाया अपाचे डिफ़ॉल्ट CorsFilter जोड़ने के लिए है:

import org.apache.catalina.filters.CorsFilter 

// Place your Spring DSL code here 
beans = { 
    corsFilter(CorsFilter) //Custom CorsFilter under src/main/java/ works as well. I prefer Apache though... 
} 

# से जवाब user215556 रूप में अच्छी तरह लेकिन अपाचे Cors फिल्टर की डिफ़ॉल्ट सेटिंग काम करता है, और साथ ही ठीक है

10

तो अगर आप यहाँ प्राप्त grails 3.2 का उपयोग कर। + आप डिफ़ॉल्ट तरीके का उपयोग कर सकते हैं।

अपने application.yml और जोड़ने के लिए जाओ:

grails: 
    cors: 
     enabled: true 

यह Access-Control-Allow-Origin '*' जोड़ देगा। यदि आप कुछ अलग करना चाहते हैं, look this page

+0

Grails के लिए 3.2+ यह सही समाधान है। –

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