2013-05-10 35 views
5

Pozwól, że dam ci trochę historii na temat tego, co próbuję zrobić.Uzyskiwanie błędów międzydomenowych podczas korzystania z angularjs w ramach mechanizmu flex (kontrola sieci) i próba załadowania szablonów/json (plików lokalnych)

Używam aplikacji Flex jako kontener dla aplikacji internetowej. W tej aplikacji Flex ma kontroler sieciowy, który ładuje pełną aplikację Angularjs. Wszystkie pliki są przechowywane lokalnie w aplikacji Flex.

Kiedy próbuję go uruchomić, nie może załadować żadnego z szablonów; są ładowane za pomocą $ routeProvider, a dane są pobierane za pomocą $ http.get.

Głównym problemem jest to, że nie pozwala mi pobierać lokalnych plików przy użyciu JavaScript, nawet jeśli jest uruchamiany z systemu plików (nie używając serwera WWW).

Sprawdziłem również to w Chrome i mam ten sam dokładny problem - podając następujący błąd.

Origin null is not allowed by Access-Control-Allow-Origin.

Z Chrome, może być ustalona przy użyciu --allow-file-access-from-files, ale nie można dowiedzieć się, jak dostać pracy za pomocą regulatora internetowej Flex/Flash.

Każda pomoc zostanie bardzo doceniona.

+0

Jestem zdezorientowany. Czy budujesz aplikację AIR Desktop? JEŚLI tak, wówczas Flex nie powinien mieć problemów z wieloma domenami. Jeśli budujesz aplikację opartą na przeglądarce; co to znaczy używać aplikacji Flex jako kontenera do aplikacji internetowej? – JeffryHouser

+0

Jest to aplikacja komputerowa, która nie powinna mieć żadnych problemów, ale ma. – xil3

Odpowiedz

1

Niestety, prawdopodobnie nie możesz. Nie wiem, co silnik Flex zawija w swoich kontrolerach sieciowych, ale powodem, dla którego w tym momencie wpadasz, jest bezpieczeństwo.

Ma to uzasadnione powody, aby uniemożliwić JS bezpośredni dostęp do systemu plików.

Proponuję jedno z dwóch obejść.

+0

Ograniczenia projektu nie pozwalają na uruchamianie żadnego serwera WWW. Więc nie ma sposobu, aby wyłączyć ograniczenia bezpieczeństwa, tak jak w Chrome? W końcu używa zestawu internetowego, więc musi być jakiś sposób. Jako samodzielna aplikacja powinienem mieć pełną kontrolę nad widokiem/kontrolerem sieci. I przepraszam, ponieważ jestem całkiem nowym użytkownikiem Flex. – xil3

+0

Myślę, że ograniczenie jest w specyfikacji JavaScript, a aplikacja Chrome (nie webkit i/lub silnik VS JS) oferuje, aby zastąpić to konkretne ograniczenie. Pamiętaj, że Chrome i webkit to nie to samo. Tak więc Flex musi oferować podobne zastąpienie, tak jak robi to Chrome. – fredrik

+0

A Flex nie oferuje żadnych dostosowań? Czy istnieją inne widoki/kontrolery sieci, których mogę używać poza 'mx: html'? Muszą tam być pewne parametry, które mogę tam przekazać. Po prostu wydaje się tak ograniczony. – xil3

0

również można spróbować użyć $ http.jsonp, zamiast $ http.get choć może trzeba zmienić angularjs kod ....

+0

Nie zmieni to jednak sposobu, w jaki '$ routeProvider' uzyskuje dostęp do plików. – xil3

+0

Miałem na myśli, że powinieneś zmienić także zachowanie $ routeProvider w AngularJS. Musiałem zrobić kilka podobnych zmian, aby móc uzyskać szablon za pośrednictwem jsonp. Wiem, że to nie jest najlepszy sposób, ale to jedyny, który udało mi się znaleźć. – Eylen

+0

Ah, rozumiem, co masz na myśli. Problem polega na tym, że będę musiał aktualizować AngularJS za każdym razem, gdy będą mieć aktualizację. Powodem, dla którego tworzę go jako aplikację internetową w ramach Flex, jest możliwość ponownego wykorzystania tej funkcjonalności, gdy zdecydujemy się przenieść ją na prawdziwie internetową platformę. – xil3

2

Jeśli jeszcze nie masz zrobić tak. Spróbuj skonfigurować politykę dla swojej aplikacji crossdomain.

Problem jest zdecydowanie spowodowany przez CORS, przeglądarka egzekwuje to ograniczenie bezpieczeństwa. W twoim przypadku przeglądarka jest elastyczną kontrolą sieci.

Możesz nie być w stanie obejść tego problemu bez korzystania z serwera WWW.Po utworzeniu żądania dla pliku, zasady wzajemnego udostępniania zasobów źródłowych nie zezwalają na ładowanie zasobu bez uprzedniej autoryzacji od hosta obsługującego plik. Ta autoryzacja ma postać nagłówka http, takiego jak:

Access-Control-Allow-Origin: *

+0

Tak, próbowałem to ustawić, ale nie działa bez serwera WWW, jak powiedziałeś. – xil3

+0

Możesz być w stanie dodać nagłówek początku do żądania http przez '$ http.defaults.headers.common [" origin "] = 'somedomain'; 'chociaż musisz także jakoś podrobić' Access-Control-Allow-Origin: * 'w odpowiedzi na pierwotne żądanie. Jednak to nie będzie takie proste. Czy mogę zapytać, dlaczego wymaga się, aby nie używać serwera WWW? Wywoływanie wywołań HTTP w celu ładowania plików w javascript wymaga jakiegoś serwera WWW, którego nie ma. Może to być jednak bardzo prosty serwer WWW. Nawet ty sam piszesz przy pomocy node.js lub jakiegoś innego języka. –

0

Wierzę, że istnieją co najmniej 2 implementacje renderowania strony w programie Flex. Szybko przejrzałem dokumentację dla StageWebView i odkryłem, że schemat: uri pozwala na lokalne żądania XMLHttpRequests (w zasadzie to, co robi $ http.get).

+0

Sprawdziłem StageWebView, ale brakuje mu funkcjonalności potrzebnej do komunikacji z JavaScript z powrotem do aplikacji Flex AIR i na odwrót. – xil3