2010-01-20 20 views

Odpowiedz

28

Nie można uzyskać informacji o domenie, subdomenie lub numerze portu. Możesz jednak użyć JSONP, jeśli masz dostęp zarówno do demona i żądającej witryny. Jeśli dane muszą zostać zwrócone, wówczas daemon musi obsługiwać parametr zapytania callback i zwracać go poprawnie sformatowany.

przekazać te informacje do demona:

$.getJSON('http://domain.com:8080/url/here?callback=?', { 
    key: 'value', 
    otherKey: 'otherValue' 
}, function(data){ 
    // Handles the callback when the data returns 
}); 

Teraz wystarczy upewnić się, że demon obsługuje parametr callback. Na przykład, jeśli callback=mycallback powrocie z demonem (jedyną rzeczą pisemnej do strony) powinien wyglądać następująco:

Za dodatkową par klucz/wartość:

mycallback({'returnkey':'returnvalue', 'other':'data' }); 

na tablicy:

mycallback([1,2,3]); 

Jeśli nie masz mechanizmu JSONP lub podobnego, nie możesz komunikować się między domenami za pomocą jQuery.

+2

Czy istnieje ogólny sposób zastąpić 'domenę. com' W ten sposób może działać tylko w produkcji, ponieważ używam 'localhost' w środowisku rozwijającym się. – user198729

+4

Powinieneś być w stanie użyć ''http: //' + window.location.hostname + ': 8080/url'' do zbudowania adresu URL, który będzie działał lokalnie i online. –

37

To łamie Same origin policy. Nie możesz użyć innego portu, nawet jeśli używasz tej samej domeny.

Możesz użyć JSONP jako sugerowanego Doug.

Albo, jako inne możliwe obejście, można ustawić bardzo prosty reverse proxy (używając mod_proxy, jeśli jesteś na Apache). Umożliwi to korzystanie ze ścieżek względnych w żądaniu AJAX, podczas gdy serwer HTTP będzie pełnić rolę proxy dla dowolnej "zdalnej" lokalizacji.

Podstawową dyrektywą konfiguracyjną do ustawienia odwrotnego proxy w mod_proxy jest ProxyPass. byś zazwyczaj używają go w następujący sposób:

ProxyPass  /ajax/  http://www.localhost:8080/ 

w tym przypadku byłoby poprosić /ajax/test.xml z jQuery, ale w rzeczywistości serwer służyłoby to działając jako pełnomocnik do http://www.localhost:8080/test.xml wewnętrznie.

Jeśli korzystasz z IIS, możesz użyć funkcji Managed Fusion URL Rewriter and Reverse Proxy do skonfigurowania odwrotnego proxy.

+1

+1 Za fantastyczną odpowiedź. Odpowiedziałem na napisaną odpowiedź "bla bla bla", a ty dostarczyłeś bardzo realistyczne rozwiązanie. Dzięki, Daniel! –

+0

Och, proxy spowoduje dodatkowe przetwarzanie po stronie serwera.Tak, wybiorę jsonP – user198729

+0

Byłem drapanie się na cały dzień próbując zrozumieć, dlaczego nie mogłem opublikować danych w portach, zanim znalazłem to. Dzięki. – screenm0nkey

2

To liczy się jako inne pochodzenie, nawet jeśli masz je na tym samym polu, tylko na innym porcie.

Jeśli kierujesz reklamy głównie na nowe przeglądarki, takie jak FireFox 3.5 i nowsze, możesz spróbować dodać nagłówki Access-Control do swojej aplikacji w innym porcie i zezwolić na połączenia z domyślnej puli aplikacji. Informacje o nagłówkach kontroli dostępu można znaleźć tutaj: https://developer.mozilla.org/en/HTTP_access_control

IE implementuje go też (znów w użyciu innego ActiveX Control, dlaczego tak jest?): http://blogs.msdn.com/ie/archive/2009/01/14/completing-access-control-support-for-xdomainrequest.aspx i http://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx

Powiązane problemy