2012-11-19 15 views
5

Sono una specie di novellino dello sviluppo web e dopo un sacco di difficoltà nel web, sono giunto a una soluzione. Lo condivido perché ritengo che non sia molto ben documentato e possa essere utilizzato da qualcun altro e perché ho bisogno di un feedback.Come impostare un criterio di dominio incrociato reale con spring e jquery

Desidero fornire a domini specifici l'accesso a un'API.

Prima di tutto, ho provato a impostare le intestazioni della richiesta ma non ha funzionato affatto per due ragioni.

La prima ragione è che non stava permettendo in crossdomain.xml:

<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> 
      <allow-http-request-headers-from domain="domain1WithoutSlashAtTheEnd" headers="*"/> 
      <allow-http-request-headers-from domain="domain2WithoutSlashAtTheEnd" headers="*"/> 
    </cross-domain-policy> 

La seconda ragione è che ho cercato di impostare il "access-control-allow-origine" header mentre è inutile. Qualsiasi intestazione personalizzata come questa è semplicemente ignorata. In realtà, il server non ha bisogno di niente del genere e il suo comportamento predefinito mi ha permesso di ottenere l'origine (dominio) della chiamata, che sono stato in grado di elaborare in un filtro come segue:

String origin = hsRequest.getHeader("Origin"); 
    if (allowedDomainList.contains(origin)) { 
     hsResponse.setHeader("Access-Control-Allow-Origin", origin); 
    } else { 
     throw new SomeException("domain not allowed"); 
    } 

dove " allowedDomainList "è un elenco di String in cui fornisco tutti i domini che autorizzo ad accedere alla mia API. Sembra funzionare bene. Cosa ne pensi? Vuoi essere qualcosa di più specifico:

headers="*" 

Forse solo dire "Access-Control-Allow-Origin". Poi ho visto che c'è un attributo "sicuro" e non so cosa farmene.

Ho anche un problema con il codice che ho già:

<!DOCTYPE cross-domain-policy 
    SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
     <cross-domain-policy> 
     <allow-access-from domain="*" /> 
     </cross-domain-policy> 

E mi chiedo come potrebbe interferire con il comportamento della mia politica. Sembra che non abbia impatto ma il crossdomain.xml non mi è molto chiaro.

L'ultimo punto riguarda jQuery (http://api.jquery.com/jQuery.ajax/). Perché jQuery ha un problema di impostare le intestazioni se non riusciamo a farle sul lato server? Inoltre, ha due modi di "dare" intestazioni: l'uso di "beforeSend" e "headers". Questi 2 punti non hanno senso per me e, come puoi vedere sopra, mi hanno fatto perdere molto tempo per niente alla fine!

Grazie in anticipo per le vostre risposte!

+1

Se si sta comunicando tra iFrame e non si preoccupa di IE6 e 7, è possibile utilizzare il nuovo 'postMessage()'. https://developer.mozilla.org/en-US/docs/DOM/window.postMessage –

+0

Origine stringa = hsRequest.getHeader ("Origine"); \t \t \t se (allowedDomainList.contains (origine)) { \t \t \t \t hsResponse.setHeader ("Access-Control-Allow-Origin", origine); \t \t \t} else { \t \t \t \t di ritorno; \t \t \t} – user1835565

+0

Sopra, la mia correzione. Ancora test. Non voglio usare iframe, voglio che il dominio esterno sia responsabile al 100% del suo codice. Fornisco solo le funzioni del server. – user1835565

risposta

1

Invece di pensare a come consentire a domini specifici di accedere alla tua API, forse questi altri domini dovrebbero accedere alla tua API in modo diverso.

Se gli altri domini effettuano una richiesta sul Web da un server Web anziché dal proprio client, non ci si deve preoccupare affatto dello scripting cross-domain.

Il client dell'altro dominio può postare sul proprio server Web, effettuare la richiesta Web sul server e restituire il risultato al proprio client.

Inoltre, ci sono molti modi per proteggere la tua API senza mantenere un elenco di domini che hanno accesso se sei preoccupato per la sicurezza.

Problemi correlati