2013-07-25 35 views
8

Tôi đang có ứng dụng có giao diện người dùng được xây dựng bằng mã HTML, CSS và Javascript. Phụ trợ sẽ được tạo bằng cách sử dụng java cốt lõi, Restlet.Cuộc gọi qua các trang web không có JSONP

Bây giờ vấn đề thực sự là lối vào và phụ trợ cả hai sẽ có trên các máy chủ khác nhau với các cổng khác. như, lối vào là: http://clientLookup (chỉ là ví dụ) Và backend được bật, http://lcgrke:8080

Bây giờ như tôi sẽ gửi cho máy chủ hoặc nghỉ ngơi cuộc gọi từ frontend qua Ajax Yêu cầu hoặc jQuery Ajax sau đó tôi nhận được vấn đề kịch bản bên chéo (SOP - chính sách nguồn gốc giống nhau). Tôi không nhận được làm thế nào để có được xung quanh này.

JSONP có thể là một trong các tùy chọn, nhưng nó sẽ chỉ hoạt động cho các cuộc gọi GET, nhưng trong ứng dụng của tôi, tôi sẽ có các yêu cầu GET/POST. Ngoài ra, một số url của máy chủ sẽ không được kích hoạt JSONP (không hỏi tôi tại sao, chỉ chấp nhận chúng sẽ không thể chỉnh sửa), vì vậy JSONP dường như không phải là lựa chọn tốt hơn.

Bất cứ ai có thể vui lòng giải thích cho tôi cách tôi sẽ giải quyết vấn đề này không?

+0

google cors ajax – dandavis

+0

Bạn đã thử [easyXDM] (https://github.com/oyvindkinsey/easyXDM) chưa? – xmikex83

Trả lời

0

Cách hiện đại để xử lý yêu cầu trang web chéo là sử dụng CORS thay vì JSONP, mặc dù bạn phải biết về trình duyệt nào hỗ trợ CORS.

Bạn có thể sử dụng CORS với các trình duyệt gần như hiện đại (IE10, FF, Chrome, Safari, Opera), nhưng không phải với IE9/8.

Với IE9/8, bạn có thể sử dụng một kỹ thuật khác được gọi là XDomainRequest, nhưng bạn phải triển khai nó qua JSNI.

Mục đích của việc sử dụng CORS vs JSONP là ở phía máy chủ của bạn, bạn chỉ cần thêm bộ lọc và mọi thứ sẽ hoạt động ngoài hộp (RPC, RF, v.v.).

Để sử dụng CORS trong gwt, bạn có thể đọc page trong trang web gwtquery nơi bạn có ví dụ về bộ lọc. Trong trang đó, bạn cũng có thông tin hữu ích về jsonp và cách sử dụng gwtquery ajax để đơn giản hóa cách RequestBuilder của gwt.

+1

Cảm ơn bạn đã phản hồi tốt. Tôi đã đi qua các liên kết được cung cấp bởi bạn và đã có thể chạy yêu cầu miền chéo. Bây giờ tôi đang nghĩ, nếu máy chủ không có Access-Control-Allow-Origin: *, và tôi không thể thay đổi nó thì phải làm gì trong trường hợp đó? – vbjain

+1

Nói một cách đơn giản, để yêu cầu cross site làm việc bằng CORS, bắt buộc phải gửi header, Access-Control-Allow-Origin: * hoặc Access-Control-Allow-Origin: ? Điều gì sẽ xảy ra nếu máy chủ không chịu trách nhiệm với loại tiêu đề này? – vbjain

+0

Trong CORS, máy khách thực hiện 2 yêu cầu tới máy chủ (OPTION và POST/GET/PUT ...). Với yêu cầu 'doOption', máy chủ phải trả lời bằng' Access-Control-Allow-Origin' 'Access-Control-Allow-Methods' và' Access-Control-Allow-Headers' (phần cuối cùng chỉ khi bạn thêm bất kỳ điều kiện nào tiêu đề cho XHR của bạn). Với 'doPost', nó chỉ cần thêm' Access-Control-Allow-Origin'. Và có họ là bắt buộc nếu không khách hàng sẽ từ chối XHR. –

0

Nếu bạn đang sử dụng PHP và có sẵn thư viện php_culr, bạn có thể muốn tận dụng nguồn gốc chéo cho máy chủ. Bạn có thể xem ví dụ tại đây: http://davidwalsh.name/curl-post hoặc bạn có thể sử dụng chức năng file_get_contents và sắp xếp từng tham số đã đăng hoặc chỉ chuyển các tham số nhận được mà bạn muốn (nếu cần).

Hy vọng điều này sẽ hữu ích.

0

Ben Alman có một tập lệnh proxy đơn giản mà tôi đã sử dụng như một giải pháp tạm thời cho loại tình huống này.

Về cơ bản, nó chuyển tiếp các yêu cầu GET và POST bằng cách sử dụng curl.

http://benalman.com/projects/php-simple-proxy/

$url = $_GET['url']; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
if (strtolower($_SERVER['REQUEST_METHOD']) == 'post') { 
    curl_setopt($ch, CURLOPT_POST, true); 
    //curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST); 

    $vin = $_POST["vin"]; 
    $subscriberProgramXML = $_POST["subscriberProgramXML"]; 

    $data = array("vin" => $vin, "subscriberProgramXML" => $subscriberProgramXML); 
    $data_string = json_encode($data); 

    $httpHeader = array('Content-Type: application/json', 'Content-Length: ' .strlen($data_string)); 

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader); 
} 

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

curl_setopt($ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT']); 


list($header, $contents) = preg_split('/([\r\n][\r\n])\\1/', curl_exec($ch), 2); 

$status = curl_getinfo($ch); 

curl_close($ch); 

// Set the JSON data object contents, decoding it from JSON if possible. 
$decoded_json = json_decode($contents); 
$data['contents'] = $decoded_json ? $decoded_json : $contents; 

// Generate appropriate content-type header. 
$is_xhr = strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'; 
header('Content-type: application/' . ($is_xhr ? 'json' : 'x-javascript')); 

// Get JSONP callback. 
$jsonp_callback = $enable_jsonp && isset($_GET['callback']) ? $_GET['callback'] : null; 

// Generate JSON/JSONP string 
$json = json_encode($data); 

print $jsonp_callback ? "$jsonp_callback($json)" : $json; 

mã được copypasted từ php gốc, nhưng nó chỉ là một phần của mã này. Nó minh họa giải pháp.

0

Khi @Manolo nói đường đi là sử dụng CORS (bạn có thể xem thêm chi tiết tại đây: http://blogs.mulesoft.org/cross-domain-rest-calls-using-cors/ - TUYÊN BỐ TỪ CHỐI: Tôi đã viết bài viết đó, nhưng không trả lời tự động này, bạn có thể tìm kiếm CORS và bạn ' sẽ tìm thấy các bài viết tương tự).

Điều duy nhất tôi có thể thêm vào phản hồi Manolo là nếu bạn sử dụng jQuery, bạn không phải lo lắng về XDomainRequest của IE, vì jQuery tính đến các chi tiết tương thích trình duyệt đó.

Cũng kể từ khi bạn đang sử dụng Restlet, bài viết này sẽ rất hữu ích: http://kodemaniak.de/2010/07/cross-domain-ajax-with-restlet-and-jquery/

tôi không bao giờ làm việc với Restlet, nhưng kể từ khi được dựa Java, lựa chọn đơn giản khác để thêm CORS là để tạo hoặc sử dụng một bộ lọc, đây là một triển khai bộ lọc giấy phép Apache: https://bitbucket.org/thetransactioncompany/cors-filter/src

1

Tôi đã gặp vấn đề tương tự cách đây không lâu. Bạn có thể cài đặt PHP trên máy chủ giao diện người dùng của bạn và thực hiện cuộc gọi AJAX đến một tập lệnh PHP trên máy chủ đó. Có một số thư viện HTTP cho PHP (cURL là phổ biến nhất) mà bạn có thể sử dụng để thực hiện một yêu cầu HTTP đến máy chủ phụ trợ của bạn. Về cơ bản bạn có thể viết một kịch bản PHP trên máy chủ giao diện người dùng của bạn để hoạt động như một người trung gian.