启用CORS后,AJAX请求仍被阻止

时间:2014-12-06 23:11:33

标签: jquery ajax web-services

我正在使用JAX-RS构建一个Web服务,我在服务器端和AJAX请求中都启用了CORS,但我仍然收到错误消息:

阻止跨源请求:同源策略禁止在http://www.bookstore.com/orderservice/order读取远程资源。这可以通过将资源移动到同一域或启用CORS来解决。有什么想法吗?感谢。

服务器端代码:

<jaxrs:ser <bean id="cors-filter" class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter"/>ver name="OrderService" address="http://www.bookstore.com">
          <jaxrs:serviceBeans>
                 <ref bean="orderServiceRest" />
          </jaxrs:serviceBeans>
          <jaxrs:providers>
                 <ref bean="jacksonProvider" />
                 <ref bean="cors-filter" />
          </jaxrs:providers>

          <jaxrs:schemaLocations>
                   <  <jaxrs:schemaLocation>com.bookengine.ws.service.representation.OrderRequest</jaxrs:schemaLocation>
                 <jaxrs:schemaLocation>com.bookengine.ws.service.representation.OrderRepresentation</jaxrs:schemaLocation>
          </jaxrs:schemaLocations>

   </jaxrs:server>
   <bean id="orderServiceRest" class="com.bookengine.ws.service.OrderResource" />

   AJAX Request
   $.ajax({
             headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Access-Control-     Allow-Origin': "http://www.bookstore.com/orderservice"
            },
            type: 'POST',
            crossDomain: true,
            contentType: 'application/json',
            dataType: 'json',
            data: '{"orderId":null,"bookId":"X1","status":null,"customer":{"name":"John   Smith","address":"312 N State Street, Chicago IL 60611","phone":"312-345-9876","custId":"1234"},"paymentinfo":null}',
            url: 'http://bookstore/orderservice/order',                                                               
            error: function(xhr, status, error) {

            // Display a generic error for now.
                   alert("AJAX Error!");
                 },
            success: function (data) {
                var output = "<ul>";
                output += "<li>" + "Order ID: " + data.orderID
                        + "<br>Book ID: " + data.bookID
                        + "<br>Status: " + data.status
                        + "</li>";
                output += "</ul>";
                alert("Hello from sucess");
             document.getElementById("buydata").innerHTML = output;  
            }
  });

2 个答案:

答案 0 :(得分:1)

这是浏览器中的安全保护,以防止从一个域到另一个域的Ajax调用。如果您通过添加Access-Control-Allow-Origin拥有http://www.bookstore.com/orderservice/order的域,则只能阻止这种情况发生: 到服务器返回的标头或将您的Web服务转移到同一个域。

答案 1 :(得分:0)

您无法通过向发送请求添加标头来解决此问题。

CORS是从服务器启用的,其中网站本身决定允许哪些来源访问它,并且必须由网站本身添加CORS标头,该网站告诉浏览器它应该允许来自哪个来源。

因此,您必须控制http://www.bookstore.com域及其服务器才能在其上启用CORS。

另一个交叉起源的可能性是JSONP,但网站本身也必须明确支持JSONP请求(因为它们的结构与常规请求不同)。