2013-04-24 6 views
37

पर हेडर जोड़ता है, मैं क्लाइंट को किए गए प्रत्येक प्रतिक्रिया के लिए "हेडर-कंट्रोल-ऑब्जेक्ट-ऑरिजन", "*" जोड़ना चाहता हूं, जब भी मेरे आवेदन में शेष नियंत्रकों के लिए अनुरोध किया गया है संसाधन साझा करने वर्तमान में मैं इसे मैन्युअल रूप सेस्वचालित रूप से प्रत्येक प्रतिक्रिया

HttpHeaders headers = new HttpHeaders(); 
headers.add("Access-Control-Allow-Origin", "*"); 

इसका काम कर रहे है, लेकिन इसके बहुत निराशा होती है की तरह प्रत्येक को यह शीर्षक और हर विधि जोड़ने हूँ '। मैं वसंत डॉक्स जो हमें प्रत्येक प्रतिक्रिया

<mvc:interceptors> 
<bean id="webContentInterceptor" 
class="org.springframework.web.servlet.mvc.WebContentInterceptor"> 
<property name="Access-Control-Allow-Origin" value="*"/> 
</bean> 
</mvc:interceptors> 

लेकिन जब मैं इस का उपयोग यह त्रुटि फेंकता है कि संपत्ति के नाम पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति के नहीं मिला पर हेडर संशोधित करने की अनुमति में webContentInterceptor पाया तो वहाँ कोई अन्य तरीका है हम प्रत्येक प्रतिक्रिया

अद्यतन पर स्वचालित रूप से शीर्षलेख जोड़ सकते हैं! स्प्रिंग ढांचे 4.2 बहुत या तो एक विधि या एक नियंत्रक ही @CrossOrigin एनोटेशन जोड़कर इस सरल https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

उत्तर

53

मुझे हाल ही में इस मुद्दे में मिला और यह समाधान मिला। आप इन हेडर जोड़ने के लिए एक फिल्टर का उपयोग कर सकते हैं:

import java.io.IOException; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.filter.OncePerRequestFilter; 

public class CorsFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
            HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 
      response.addHeader("Access-Control-Allow-Origin", "*"); 
      if (request.getHeader("Access-Control-Request-Method") != null 
        && "OPTIONS".equals(request.getMethod())) { 
       // CORS "pre-flight" request 
       response.addHeader("Access-Control-Allow-Methods", 
         "GET, POST, PUT, DELETE"); 
       response.addHeader("Access-Control-Allow-Headers", 
         "X-Requested-With,Origin,Content-Type, Accept"); 
      } 
      filterChain.doFilter(request, response); 
    } 

} 

भूलना अपने वसंत संदर्भ के लिए फिल्टर न जोड़ें:

<bean id="corsFilter" class="my.package.CorsFilter" /> 

और web.xml में मानचित्रण:

<filter> 
    <filter-name>corsFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

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

थोड़ा आगे जाने के लिए आप इस फ़िल्टर को सक्षम या अक्षम करने के लिए स्प्रिंग प्रोफ़ाइल निर्दिष्ट कर सकते हैं:

<beans profile="!cors"> 
    <bean id="corsFilter" class="my.package.FilterChainDoFilter" /> 
</beans> 

<beans profile="cors"> 
    <bean id="corsFilter" class="my.package.CorsFilter" /> 
</beans> 

(उपलब्ध कराने FilterChainDoFilter CorsFilter के समान है, लेकिन जो केवल doFilterInternal (..) में filterChain.doFilter(request, response); करता है)

+0

मेरे फिल्टर नहीं बुलाया जाता है :(मैं उपयोग कर रहा हूँ स्प्रिंग सिक्योरिटी जो इस तरह से फ़िल्टर का उपयोग करती है, मेरे पास पहले से ही DelegatingFilterProxy web.xml में कॉन्फ़िगर किया गया था। कोई सुझाव? – bentzy

+0

@ बेनी डेलेगेटिंगफिल्टरप्रॉक्सी सिर्फ एक प्रॉक्सी है जो आपके फ़िल्टर को लपेटती है, जैसा कि मैंने इसे देखा है, यह 'पहले ही पंजीकृत नहीं' हो सकता है क्योंकि आप जितना चाहें उतना हो सकते हैं। सही नाम के साथ एक और जोड़ने का प्रयास करें (मेरे उदाहरण corsFilter में)। – Dayde

+0

आप web.xml में DelegatingFilterProxy का उपयोग क्यों करते हैं? यह मेरे लिए काम नहीं करता है। यह केवल तभी काम करता है जब मैं कॉर्सफिल्टर सेट करता हूं – Igorock

0

WebContentInterceptor एक संपत्ति Access-Control-Allow-Origin नामित नहीं है, और जहाँ तक मैं देख सकते हैं, यह स्थापित करने के लिए किसी भी तरीकों का खुलासा नहीं करता प्रतिक्रिया शीर्षलेख। यह कुछ गुणों को सक्षम/अक्षम करके केवल कुछ कैश संबंधित शीर्षलेख सेट करता है। लेकिन यह आपके स्वयं के इंटरसेप्टर (या सर्वलेट फ़िल्टर) लिखना तुच्छ है जो ऐसा करता है।

5

आप हेडर नियंत्रक के लिए आप @ModelAttribute एनोटेशन का उपयोग कर सकते सेट करना चाहते हैं।

@ModelAttribute 
public void setVaryResponseHeader(HttpServletResponse response) { 
    response.setHeader("Vary", "Accept"); 
}  
0

मैं भी इस मुद्दे का सामना कर रहा हूँ और मैं इस कोड तय मुद्दा जोड़ने की है।

public static HttpServletResponse getResponse(HttpServletResponse response) { 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setCharacterEncoding("UTF-8"); 
    response.setHeader("Access-Control-Allow-Methods", "POST, GET"); 
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 
    return response; 
} 
1

स्प्रिंग 4 में करने के लिए @CrossOrigin एनोटेशन जोड़कर इस सरल, आप @CrossOrigin() जो आप पार मूल मुद्दे की अनुमति देता है का उपयोग कर सकते हैं।

सुरक्षा कारणों से, ब्राउज़र वर्तमान उत्पत्ति के बाहर रहने वाले संसाधनों पर AJAX कॉल को प्रतिबंधित करता है। उदाहरण के लिए, जब आप एक टैब में अपने बैंक खाते की जांच कर रहे हैं, तो आप किसी अन्य टैब में evil.com वेबसाइट प्राप्त कर सकते हैं। Evil.com से लिपियों को आपके क्रेडेंशियल्स का उपयोग करके अपने बैंक एपीआई (अपने खाते से पैसे वापस लेना!) में AJAX अनुरोध करने में सक्षम नहीं होना चाहिए।

क्रॉस-मूल संसाधन साझाकरण (सीओआरएस) अधिकांश ब्राउज़रों द्वारा लागू एक डब्ल्यू 3 सी विनिर्देश है जो आपको एक लचीला तरीके से निर्दिष्ट करने की अनुमति देता है कि किस प्रकार के क्रॉस डोमेन अनुरोध अधिकृत हैं, कुछ कम सुरक्षित और कम शक्तिशाली हैक जैसे IFrame का उपयोग करने के बजाय या जेएसओएनपी।

स्प्रिंग फ्रेमवर्क 4.2 जीए सीओआरएस आउट-ऑफ-द-बॉक्स के लिए प्रथम श्रेणी का समर्थन प्रदान करता है, जो आपको सामान्य फ़िल्टर आधारित समाधानों से कॉन्फ़िगर करने का एक आसान और अधिक शक्तिशाली तरीका प्रदान करता है।

आप उस पर CORS को सक्षम करने के लिए अपने @RequestMapping एनोटेटेड हैंडलर विधि में @CrossOrigin एनोटेशन जोड़ सकते हैं। डिफ़ॉल्ट रूप से @CrossOrigin सभी मूल और HTTP विधियों @RequestMapping एनोटेशन में निर्दिष्ट की अनुमति देता है:

@RestController 
@RequestMapping("/account") 
public class AccountController { 

    @CrossOrigin 
    @RequestMapping("/{id}") 
    public Account retrieve(@PathVariable Long id) { 
     // ... 
    } 

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}") 
    public void remove(@PathVariable Long id) { 
     // ... 
    } 
} 

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

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

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

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