2012-11-19 9 views
5

Ich bin ein bisschen ein Anfänger auf Web-Entwicklung und nach einer Menge durch das Internet kämpfen, habe ich zu einer Lösung gekommen. Ich teile es, weil ich fühle, dass es nicht wirklich gut dokumentiert ist und von jemand anderem benutzt werden könnte und weil ich ein Feedback brauche.Wie eine echte Cross-Domain-Politik mit Frühling und Jquery

Ich wollte bestimmten Domänen Zugriff auf eine API geben.

Zuerst habe ich versucht, Header der Anfrage zu setzen, aber es hat aus zwei Gründen überhaupt nicht funktioniert.

Der erste Grund ist, dass ich es nicht in crossdomain.xml ermöglicht wurde:

<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> 

Der zweite Grund ist, dass ich die „Access-Control-allow-origin“ Header zu setzen versucht, während es nutzlos ist. Ein benutzerdefinierter Header wie dieser wird einfach ignoriert. Eigentlich hat der Server nicht irgendetwas dieser Art benötigen und sein Standardverhalten mir erlaubt, den Ursprung (Domäne) des Anrufs zu erhalten, die konnte ich es in einem Filter wie folgt verarbeiten:

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

wo " allowedDomainList "ist eine Liste von Strings, in der ich alle Domains vergebe, die ich auf meine API zugreifen darf. Es scheint gut zu funktionieren. Was denkst du darüber? Möchten Sie präziser sein:

headers="*" 

Vielleicht nur "Access-Control-Allow-Origin" sagen. Dann habe ich gesehen, dass es ein "sicheres" Attribut gibt und ich weiß nicht, was ich damit machen soll.

Ich habe auch ein Problem mit diesem Code habe ich bereits:

<!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> 

Und ich frage mich, wie es mit dem Verhalten meiner Politik interferieren könnten. Es scheint, dass es keine Auswirkungen hat, aber die crossdomain.xml ist sehr unklar für mich.

Letzter Punkt ist über jQuery (http://api.jquery.com/jQuery.ajax/). Warum hat jQuery etwas, um die Header zu setzen, wenn wir sie nicht auf der Serverseite bekommen können? Außerdem gibt es zwei Möglichkeiten, Header zu "geben": die Verwendung von "beforeSend" und "headers". Diese 2 Punkte ergeben für mich keinen Sinn und wie du oben sehen kannst, verlor ich am Ende viel Zeit umsonst!

Vielen Dank im Voraus für Ihre Antworten!

+1

Wenn Sie zwischen iFrames kommunizieren und sich nicht um IE6 & 7 kümmern, können Sie das neue 'postMessage()' verwenden. https://developer.mozilla.org/en-US/docs/DOM/window.postMessage –

+0

String Herkunft = hsRequest.getHeader ("Ursprung"); \t \t \t if (allowedDomainList.contains (Herkunft)) { \t \t \t \t hsResponse.setHeader ("Access-Control-Allow-Origin", Herkunft); \t \t \t} else { \t \t \t \t Rückkehr; \t \t \t} – user1835565

+0

Oben, meine eigene Korrektur. Noch testen. Ich möchte keine iframes verwenden, ich möchte, dass die externe Domäne zu 100% für seinen Code verantwortlich ist. Ich biete nur Serverfunktionen an. – user1835565

Antwort

1

Anstatt darüber nachzudenken, wie bestimmte Domänen auf Ihre API zugreifen können, sollten diese anderen Domänen möglicherweise anders auf Ihre API zugreifen.

Wenn die anderen Domains einen Webantrag von dort Webserver statt ihres Clients machen, müssen Sie sich überhaupt keine Gedanken über Cross-Domain-Scripting machen.

Der Client der anderen Domäne kann auf seinem eigenen Webserver veröffentlichen, die Webanforderung an Ihren Server senden und das Ergebnis an den Client zurückgeben.

Auch gibt es viele Möglichkeiten, Ihre API zu sichern, ohne eine Liste der Domänen zu verwalten, die Zugriff haben, wenn Sie sich um die Sicherheit sorgen.

Verwandte Themen