2013-07-25 27 views
8

Mam aplikację, w której nakładka jest budowana przy użyciu kodu HTML, CSS i JavaScript. Backend zostanie utworzony za pomocą core java, Restlet.Połączenia między lokacjami bez JSONP

Teraz prawdziwym problemem jest frontend i backend, oba będą na serwerach diff z portami diff. jak, nakładka jest: http://clientLookup (tylko dla przykładu) I backend jest włączony, http://lcgrke:8080

teraz jako ja wyśle ​​do serwera lub odpocząć połączeń z frontend pośrednictwem AJAX żądanie lub jQuery Ajax następnie otrzymuję przekrój boczny skryptowy problem (SOP - polityka tego samego pochodzenia). Nie rozumiem, jak sobie z tym poradzić.

JSONP może być jedną z opcji, ale będzie działać tylko dla wywołań typu GET, ale w mojej aplikacji będę mieć żądania GET/POST. Również niektóre adresy URL serwera nie będą włączone JSONP (nie pytaj mnie dlaczego, po prostu zaakceptuj, że nie będą one edytowalne), więc JSONP nie wydaje się lepszą opcją.

Czy ktoś może mi wyjaśnić, jak poradzę sobie z tym problemem?

+0

google cors ajax – dandavis

+0

Czy próbowałeś już [easyXDM] (https://github.com/oyvindkinsey/easyXDM)? – xmikex83

Odpowiedz

0

Nowoczesny sposób obsługi zgłoszeń w wielu witrynach to: CORS zamiast JSONP, chociaż musisz wiedzieć, które przeglądarki obsługują CORS.

Możesz używać CORS z niemal nowoczesnymi przeglądarkami (IE10, FF, Chrome, Safari, Opera), ale nie z IE9/8.

Używając IE9/8 możesz użyć innej techniki o nazwie XDomainRequest, ale musisz ją zaimplementować poprzez JSNI.

Celem użycia CORS vs JSONP jest to, że po stronie serwera wystarczy dodać filtr i wszystko powinno działać fabrycznie (RPC, RF itp.).

Aby użyć CORS w gwt, możesz przeczytać ten page na stronie gwtquery, gdzie masz przykład filtra. Na tej stronie masz również przydatne informacje o jsonp i jak korzystać z gwtquery ajax, który upraszcza sposób GUt RequestBuilder.

+1

Dzięki za miłą odpowiedź. Przechodziłem przez linki dostarczone przez Ciebie i mogłem uruchomić żądanie między domenami. Teraz myślę, co jeśli serwer nie ma Access-Control-Allow-Origin: * i nie mogę go zmienić, to co należy zrobić w takim przypadku? – vbjain

+1

W prostych słowach: Aby żądanie przekierowania witryny działało z wykorzystaniem CORS, czy serwer musi wysyłać nagłówek, Access-Control-Allow-Origin: * lub Access-Control-Allow-Origin: ? Co się stanie, jeśli serwer nie odpowiada z tym typem nagłówka? – vbjain

+0

W CORS klient wysyła 2 żądania do serwera (OPCJA i POST/GET/PUT ...). Do żądania 'doOption' serwer musi odpowiedzieć' Access-Control-Allow-Origin' 'Access-Control-Allow-Methods' i' Access-Control-Allow-Headers' (ostatni tylko jeśli dodasz dodatkowe nagłówek do twojego XHR). Do 'doPost' należy dodać tylko' Access-Control-Allow-Origin'. I tak, są one obowiązkowe, w przeciwnym razie klient odrzuci XHR. –

0

Jeśli używasz PHP i masz dostępną bibliotekę php_culr, możesz chcieć wykorzystać pochodzenie krzyżowe na serwerze. Możesz zobaczyć przykład: http://davidwalsh.name/curl-post lub możesz użyć funkcji file_get_contents i serializować opublikowane parametry lub po prostu przekazać pożądane parametry (jeśli to konieczne).

Mam nadzieję, że to pomoże.

0

Ben Alman ma prosty skrypt proxy, który wykorzystałem jako tymczasowe obejście tego rodzaju sytuacji.

Zasadniczo przesyła dalej żądania GET i POST za pomocą zwijania.

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; 

że kod jest copypasted z oryginalnego php, ale to tylko część kodu. To ilustruje rozwiązanie.

0

Jako że @Manolo powiedział, że drogą do wyjścia jest użycie CORS (więcej szczegółów można znaleźć tutaj: http://blogs.mulesoft.org/cross-domain-rest-calls-using-cors/ - OŚWIADCZENIE: Napisałem ten artykuł, ale aby nie udzielić tej odpowiedzi jako autopromocję, możesz wyszukać CORS, a Ty " Znajdziesz podobne artykuły).

Jedyną rzeczą, którą mogę dodać do odpowiedzi Manolo jest to, że jeśli używasz jQuery, nie musisz się martwić o XDomainRequest IE, ponieważ jQuery uwzględnia te szczegóły kompatybilności przeglądarki.

Ponadto, ponieważ używasz Restlet, ten artykuł będzie pomocny: http://kodemaniak.de/2010/07/cross-domain-ajax-with-restlet-and-jquery/

nigdy nie pracował z Restlet, ale ponieważ jest Java, inna prosta opcja, aby dodać CORS jest stworzenie lub użyć filtru, tu jest jedna implementacja filtra licencji Apache: https://bitbucket.org/thetransactioncompany/cors-filter/src

1

Niedawno miałem ten sam problem. Możesz zainstalować PHP na swoim serwerze frontend i wywołać wywołanie AJAX do skryptu PHP na tym serwerze. Istnieje kilka bibliotek HTTP dla PHP (najpopularniejsze jest cURL), które następnie można wykorzystać do wysłania żądania HTTP do serwera zaplecza. Zasadniczo możesz napisać skrypt PHP na serwerze frontendowym, aby działał jako środkowy człowiek.