2013-07-25 4 views
8

Ho un'applicazione per la creazione di frontend utilizzando codice HTML, CSS e Javascript. Il back-end sarà creato usando core java, Restlet.Chiamate cross site senza JSONP

Ora il vero problema è il frontend e il backend entrambi saranno su server diff con porte diff anche. come, frontend è su: http://clientLookup (solo per esempio) E backend è acceso, http://lcgrke:8080

Ora, come io manderò il server o di riposo chiamate da frontend tramite Ajax Request o jQuery Ajax, allora io sono sempre il problema di scripting lato croce (SOP - stessa politica di origine). Non capisco come aggirare questo.

JSONP può essere una delle opzioni, ma funzionerà solo per le sole chiamate di tipo GET, ma nella mia applicazione avrò richieste GET/POST. Inoltre, alcuni URL del server non saranno abilitati per JSONP (non chiedermi perché, accetta solo che non siano modificabili), quindi JSONP non sembra essere l'opzione migliore.

Qualcuno può spiegarmi come risolvere questo problema?

+0

google cors ajax – dandavis

+0

Hai provato [easyXDM] (https://github.com/oyvindkinsey/easyXDM)? – xmikex83

risposta

0

Il modo moderno di gestire le richieste cross site è l'utilizzo di CORS anziché JSONP, anche se è necessario essere consapevoli dei browser che supportano CORS.

È possibile utilizzare CORS con browser quasi moderni (IE10, FF, Chrome, Safari, Opera), ma non con IE9/8.

Con IE9/8 è possibile utilizzare un'altra tecnica denominata XDomainRequest, ma è necessario implementarla tramite JSNI.

L'obiettivo di utilizzare CORS vs JSONP è che sul lato server è sufficiente aggiungere un filtro e tutto dovrebbe funzionare immediatamente (RPC, RF, ecc.).

Per utilizzare CORS in gwt, è possibile leggere questo page nel sito gwtquery in cui si dispone di un esempio di filtro. In quella pagina hai anche informazioni utili su jsonp e come usare gwtquery ajax che semplifica il modo gwt RequestBuilder.

+1

Grazie per la bella risposta. Stavo passando attraverso i link forniti da te ed è stato in grado di eseguire una richiesta di dominio incrociata. Ora sto pensando, e se il server non ha Access-Control-Allow-Origin: *, e non posso cambiarlo, allora cosa dovrebbe essere fatto in quel caso? – vbjain

+1

In parole semplici, per fare in modo che la richiesta cross site funzioni usando CORS, è obbligatorio che il server debba inviare l'intestazione, Access-Control-Allow-Origin: * o Access-Control-Allow-Origin: ? Cosa succede se il server non risponde con questo tipo di intestazione? – vbjain

+0

In CORS il client effettua 2 richieste al server (OPTION e POST/GET/PUT ...). Alla richiesta 'doOption' il server deve rispondere con' Access-Control-Allow-Origin' 'Access-Control-Allow-Methods' e' Access-Control-Allow-Headers' (l'ultimo solo se si aggiungono ulteriori intestazione per il tuo XHR). Al 'doPost' deve aggiungere solo' Access-Control-Allow-Origin'. E sì, sono obbligatori altrimenti il ​​cliente rifiuterà l'XHR. –

0

Se si utilizza PHP e la libreria php_culr è disponibile, è possibile utilizzare l'origine incrociata sul server. Potete vedere un esempio qui: http://davidwalsh.name/curl-post oppure potete usare la funzione file_get_contents e serializzare i parametri inviati o semplicemente passare i parametri get che volete (se necessario).

Spero che questo aiuti.

0

Ben Alman ha uno script proxy semplice che ho utilizzato come soluzione temporanea per questo tipo di situazione.

Fondamentalmente, inoltra le richieste GET e POST utilizzando l'arricciatura.

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; 

che il codice è copypasted dal php originale, ma è solo una parte del codice. Illustra la soluzione.

0

Come ha detto @Manolo la strada da percorrere è l'uso di CORS (puoi vedere maggiori dettagli qui: http://blogs.mulesoft.org/cross-domain-rest-calls-using-cors/ - NOTA BENE: Ho scritto quell'articolo, ma per non rendere questa risposta un'auto-promozione, puoi cercare CORS e tu » troverò articoli simili).

L'unica cosa che potrei aggiungere alla risposta di Manolo è che se usi jQuery non devi preoccuparti di XDomainRequest di IE, perché jQuery tiene conto di quei dettagli di compatibilità del browser.

Anche perché si sta utilizzando Restlet, questo articolo sarà utile: http://kodemaniak.de/2010/07/cross-domain-ajax-with-restlet-and-jquery/

ho mai lavorato con Restlet, ma dal momento che è basato su Java, altra opzione semplice da aggiungere CORS è quello di creare o utilizzare un filtro, qui è implementazione di un filtro di licenza Apache: https://bitbucket.org/thetransactioncompany/cors-filter/src

1

Ho avuto lo stesso problema non molto tempo fa. Puoi installare PHP sul tuo server di frontend e rendere la chiamata AJAX a uno script PHP su quel server. Ci sono diverse librerie HTTP per PHP (cURL è il più popolare) che puoi usare per fare una richiesta HTTP al tuo server back-end. Fondamentalmente puoi scrivere uno script PHP sul tuo server di frontend per agire da intermediario.