2012-11-19 10 views
5

Jestem trochę nowicjuszem w tworzeniu stron internetowych i po wielu zmaganiach w sieci, mam rozwiązanie. Dzielę się tym, ponieważ czuję, że nie jest to dobrze udokumentowane i może być użyte przez kogoś innego, i ponieważ potrzebuję informacji zwrotnej.Jak ustawić prawdziwą politykę między domenami z wiosny i jquery

Chciałem przyznać określonym domenom dostęp do interfejsu API.

Przede wszystkim próbowałem ustawić nagłówki żądania, ale nie działało w ogóle z dwóch powodów.

Pierwszym powodem jest to, że nie pozwala go w 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> 

Drugim powodem jest to, że starałem się ustawić „Access-Control-allow-pochodzenie” nagłówek natomiast jest to bezużyteczne. Każdy taki niestandardowy nagłówek jest po prostu ignorowany. Faktycznie, serwer nie potrzebuje niczego w tym rodzaju, a jego zachowanie domyślne pozwoliło mi uzyskać pochodzenie (domeny) rozmowy, które byłem w stanie przetworzyć go w filtrze, co następuje:

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

gdzie " allowedDomainList "to lista String, w której podaję wszystkie domeny, które zezwalam na dostęp do mojego interfejsu API. Wygląda na to, że działa dobrze. Co o tym sądzisz? Chcesz być bardziej szczegółowe na temat:

headers="*" 

Może tylko powiedzieć "Access-Control-Allow-Origin". Wtedy widziałem, że istnieje "bezpieczny" atrybut i nie wiem, co z nim zrobić.

Mam też problem z tym kodem już mam:

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

I zastanawiam się jak to mogło interfer z zachowaniem mojej polityki. Wygląda na to, że nie ma on wpływu, ale plik crossdomain.xml jest dla mnie bardzo niejasny.

Ostatnia kwestia dotyczy jQuery (http://api.jquery.com/jQuery.ajax/). Dlaczego jQuery ma coś do ustawienia nagłówków, jeśli nie możemy uzyskać ich po stronie serwera? Co więcej, ma dwa sposoby na "nadawanie" nagłówków: użycie "beforeSend" i "nagłówków". Te dwa punkty nie mają dla mnie sensu i jak widać powyżej, w końcu straciłem dużo czasu na nic!

Z góry dziękuję za odpowiedzi!

+1

Jeśli komunikujesz się między iFrame i nie przejmujesz się IE6 i 7, możesz użyć nowego 'postMessage()'. https://developer.mozilla.org/en-US/docs/DOM/window.postMessage –

+0

Łańcuch pochodzenia = hsRequest.getHeader ("Origin"); \t \t \t if (allowedDomainList.contains (pochodzenie)) { \t \t \t \t hsResponse.setHeader ("Access Control Pozwala pochodzenia" pochodzenia); \t \t \t} else { \t \t \t \t powrotu; \t \t } – user1835565

+0

Powyżej, moja własna korekta. Wciąż testuję. Nie chcę używać elementów iframe, chcę, aby domena zewnętrzna była w 100% odpowiedzialna za jego kod. Po prostu zapewniam funkcje serwera. – user1835565

Odpowiedz

1

Zamiast myśleć o tym, jak zezwolić określonym domenom na dostęp do interfejsu API, być może te inne domeny powinny inaczej uzyskiwać dostęp do interfejsu API.

Jeśli inne domeny przesyłają internetowe zapytania z serwera WWW zamiast swojego klienta, nie musisz się w ogóle martwić skryptami cross-domain.

Klient drugiej domeny może publikować na swoim serwerze internetowym, przesłać żądanie sieciowe do serwera i przekazać wynik do swojego klienta.

Istnieje również wiele sposobów zabezpieczenia interfejsu API bez utrzymywania listy domen, do których dostęp jest możliwy w przypadku obaw o bezpieczeństwo.

Powiązane problemy