सवाल जर्सी के साथ जेएक्स-आरएस का उपयोग कर सीओआरएस को कैसे संभालें


मैं एक जावा स्क्रिप्ट क्लाइंट एप्लिकेशन विकसित कर रहा हूं, सर्वर-साइड में मुझे सीओआरएस को संभालने की ज़रूरत है, जेएसईसीई के साथ जेएक्स-आरएस में लिखी गई सभी सेवाएं। मेरा कोड:

@CrossOriginResourceSharing(allowAllOrigins = true)
@GET
@Path("/readOthersCalendar")
@Produces("application/json")
public Response readOthersCalendar(String dataJson) throws Exception {  
     //my code. Edited by gimbal2 to fix formatting
     return Response.status(status).entity(jsonResponse).header("Access-Control-Allow-Origin", "*").build();
}

अभी तक, मुझे त्रुटि मिल रही है अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' शीर्षलेख मौजूद नहीं है। मूल 'http: // localhost: 8080इसलिए इसलिए पहुंच की अनुमति नहीं है। "

कृपया इसके साथ मेरी सहायता करें।

सादर धन्यवाद बुद्ध पुणेथ


44
2018-01-21 11:20


मूल




जवाब:


मुझे जर्सी के साथ किसी भी मानक सीओआरएस समर्थन के बारे में पता नहीं है। @CrossOriginResourceSharing, जहां तक ​​मैं कह सकता हूं, एक सीएक्सएफ एनोटेशन है। इसलिए मुझे सच में यकीन नहीं है कि आप जर्सी के साथ इस एनोटेशन का उपयोग कैसे कर रहे हैं।

जर्सी के साथ, सीओआरएस को संभालने के लिए, मैं आमतौर पर केवल एक का उपयोग करता हूं ContainerResponseFilterContainerResponseFilter जर्सी 1 और 2 के लिए थोड़ा अलग हैं। चूंकि आपने उल्लेख नहीं किया है कि आप किस संस्करण का उपयोग कर रहे हैं, मैं दोनों पोस्ट करूंगा।

जर्सी 2

import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext request,
            ContainerResponseContext response) throws IOException {
        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization");
        response.getHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}

यदि आप प्रदाताओं और संसाधनों को खोजने के लिए पैकेज स्कैनिंग का उपयोग करते हैं, तो @Provider एनोटेशन आपके लिए कॉन्फ़िगरेशन का ख्याल रखना चाहिए। यदि नहीं, तो आपको इसे स्पष्ट रूप से पंजीकृत करने की आवश्यकता होगी ResourceConfig या Application उपवर्ग।

नमूना कोड स्पष्ट रूप से फ़िल्टर के साथ रजिस्टर करने के लिए ResourceConfig:

final ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(new CORSFilter());
final final URI uri = ...;
final HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(uri, resourceConfig);

जर्सी 1

import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;

public class CORSFilter implements ContainerResponseFilter {
    @Override
    public ContainerResponse filter(ContainerRequest request,
            ContainerResponse response) {

        response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHttpHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization");
        response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHttpHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, OPTIONS, HEAD");

        return response;
    }
}

web.xml विन्यास, आप उपयोग कर सकते हैं

<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
  <param-value>com.yourpackage.CORSFilter</param-value>
</init-param>

या ResourceConfig तुम कर सकते हो

resourceConfig.getContainerResponseFilters().add(new CORSFilter());

या पैकेज स्कैनिंग के साथ @Provider एनोटेशन।


संपादित करें

कृपया ध्यान दें कि उपर्युक्त उदाहरण में सुधार किया जा सकता है। सीओआरएस कैसे काम करता है इसके बारे में आपको और जानना होगा। कृपया देखें यहाँ। एक के लिए, आप सभी प्रतिक्रियाओं के लिए शीर्षलेख प्राप्त करेंगे। यह वांछनीय नहीं हो सकता है। आपको केवल प्रीफलाइट (या विकल्प) को संभालने की आवश्यकता हो सकती है। यदि आप एक बेहतर कार्यान्वित सीओआरएस फ़िल्टर देखना चाहते हैं, तो आप के लिए स्रोत कोड देख सकते हैं शेष सहज CorsFilter


107
2018-01-21 12:48



मैं एक उदाहरण कैसे प्राप्त कर सकता हूं ResourceConfig?? - SomethingSomething
मुझे इस कक्षा को कहां रखना चाहिए? - suhail c
किसी कारण के लिए यदि कोई अपवाद है, तो CORS फ़िल्टर संसाधित नहीं होता है और मैं प्रतिक्रिया नहीं देख सकता! डीबग करने के लिए कोई मजेदार नहीं है। - FDIM
बस इसका जिक्र है stackoverflow.com/a/17345463/3757139 कहता है, आपको जर्सी एप्लिकेशन के लोड किए गए वर्गों में फ़िल्टर क्लास को पंजीकृत / जोड़ना होगा। इससे मुझे यह काम करने में मदद मिली। - Samuel
आपको यह आयात आयात करने की आवश्यकता है javax.ws.rs.ext.Provider; - Gayan Kavirathne


दूसरा जवाब सख्ती से सही हो सकता है, लेकिन भ्रामक हो सकता है। गायब हिस्सा यह है कि आप अलग-अलग स्रोतों से फिल्टर मिश्रण कर सकते हैं। यहां तक ​​कि सोचा था कि जर्सी कोरस फ़िल्टर प्रदान नहीं कर सकता है (तथ्य यह नहीं है कि मैंने जांच की है लेकिन मुझे उस पर अन्य उत्तर पर भरोसा है), आप इसका उपयोग कर सकते हैं टोमकैट का अपना कॉरस फ़िल्टर

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


3
2018-05-13 08:39



इस उत्तर के लिए धन्यवाद। मैं इसका उपयोग करने और एम्बेडेड टॉमकैट को एक प्रतिस्थापन web.xml के साथ कॉन्फ़िगर करने में सक्षम था जिसमें CORS फ़िल्टर शामिल था - Dark Star1


peeskillet का जवाब सही है। लेकिन वेब पेज रीफ्रेश करते समय मुझे यह त्रुटि मिलती है (यह केवल पहले लोड पर काम कर रहा है):

The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Origin 'http://127.0.0.1:8080' is therefore not allowed access.

तो प्रतिक्रिया के लिए हेडर जोड़ने के लिए ऐड विधि का उपयोग करने के बजाय, मैं पुट विधि का उपयोग कर रहा हूं। यह मेरी कक्षा है

public class MCORSFilter implements ContainerResponseFilter {
    public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
    public static final String ACCESS_CONTROL_ALLOW_ORIGIN_VALUE = "*";

    private static final String ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials";
    private static final String ACCESS_CONTROL_ALLOW_CREDENTIALS_VALUE = "true";

    public static final String ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers";
    public static final String ACCESS_CONTROL_ALLOW_HEADERS_VALUE = "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With, Accept";

    public static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
    public static final String ACCESS_CONTROL_ALLOW_METHODS_VALUE = "GET, POST, PUT, DELETE, OPTIONS, HEAD";

    public static final String[] ALL_HEADERs = {
            ACCESS_CONTROL_ALLOW_ORIGIN,
            ACCESS_CONTROL_ALLOW_CREDENTIALS,
            ACCESS_CONTROL_ALLOW_HEADERS,
            ACCESS_CONTROL_ALLOW_METHODS
    };
    public static final String[] ALL_HEADER_VALUEs = {
            ACCESS_CONTROL_ALLOW_ORIGIN_VALUE,
            ACCESS_CONTROL_ALLOW_CREDENTIALS_VALUE,
            ACCESS_CONTROL_ALLOW_HEADERS_VALUE,
            ACCESS_CONTROL_ALLOW_METHODS_VALUE
    };
    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        for (int i = 0; i < ALL_HEADERs.length; i++) {
            ArrayList<Object> value = new ArrayList<>();
            value.add(ALL_HEADER_VALUEs[i]);
            response.getHttpHeaders().put(ALL_HEADERs[i], value); //using put method
        }
        return response;
    }
}

और web.xml में इस कक्षा को init-param में जोड़ें

<init-param>
            <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
            <param-value>com.yourpackage.MCORSFilter</param-value>
        </init-param>

1
2017-09-08 11:13





एनोटेशन निकालें "@CrossOriginResourceSharing(allowAllOrigins = true)"

फिर नीचे प्रतिक्रिया प्रतिक्रिया दें:

return Response.ok()
               .entity(jsonResponse)
               .header("Access-Control-Allow-Origin", "*")
               .build();

लेकिन वो jsonResponse एक POJO ऑब्जेक्ट के साथ प्रतिस्थापित करना चाहिए!


1
2017-11-25 07:23





मेरे प्रोजेक्ट के लिए इसे हल करने के लिए मैंने इसका इस्तेमाल किया माइकल के जवाब और इस पर पहुंचे:

    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
                <id>run-embedded</id>
                <goals>
                    <goal>run</goal>
                </goals>
                <phase>pre-integration-test</phase>
                <configuration>
                    <port>${maven.tomcat.port}</port>
                    <useSeparateTomcatClassLoader>true</useSeparateTomcatClassLoader>
                    <contextFile>${project.basedir}/tomcat/context.xml</contextFile>
                    <!--enable CORS for development purposes only. The web.xml file specified is a copy of
                        the auto generated web.xml with the additional CORS filter added -->
                    <tomcatWebXml>${maven.tomcat.web-xml.file}</tomcatWebXml>
                </configuration>
            </execution>
        </executions>
    </plugin>

सीओआरएस फ़िल्टर मूल उदाहरण फ़िल्टर से है टॉमकैट साइट। 

संपादित करें:
maven.tomcat.web-xml.file चर परियोजना के लिए एक पोम परिभाषित संपत्ति है और इसमें web.xml फ़ाइल का पथ है (मेरी परियोजना के भीतर स्थित)


0
2017-07-19 14:00





का उपयोग करते हुए JAX-आरएस आप बस एनोटेशन जोड़ सकते हैं @CrossOrigin(origin = yourURL) आपके संसाधन नियंत्रक के लिए। आपके मामले में होगा @CrossOrigin(origin = "http://localhost:8080") लेकिन आप भी उपयोग कर सकते हैं @CrossOrigin(origin = "*") किसी भी अनुरोध को अपने webservice के माध्यम से प्राप्त करने की अनुमति देने के लिए।
आप जांच सकते हैं इस अधिक जानकारी के लिए।


-3
2018-01-12 12:21



जब तक मुझे कुछ याद नहीं आ रहा है, तब तक आपका लिंक और संदर्भित एनोटेशन वसंत में नहीं है, जेएक्स-आरएस में नहीं। - adammtlx
यह वसंत webservice के लिए है - Harsh Maheswari