2013-05-03 15 views
8

Nie jestem pewien, czy chodzi o technologie, czy o moje zrozumienie technologii.Początek jest niedozwolony w programie Access-Control-Allow-Origin - jak włączyć CORS za pomocą bardzo prostego zestawu stron WWW i guice

Mam aplikację html5 napisaną w javascript i html hostowaną na serwerze apache 2.2.

Mam aplikację java napisaną w języku Java za pomocą przystani, guice, jackson, koszulki, która obsługuje prostą usługę REST.

Obie aplikacje uruchomione na tym samym polu, jeden na porcie 80 (czystego aplikacji HTML5 hostowane na apache), druga na 8080 (czystego aplikacji java hostowane na molo/Guice)

Wierzę, że odpowiedź jest nagłówki im wysyłają z powrotem. Nagłówki CORS informują przeglądarkę, że zezwalasz aplikacjom zewnętrznym na korzystanie z interfejsu API. Nie mogę się domyślić, jak skonfigurować serwer Jetty, Guice, aby zwracał prawidłowe nagłówki CORS.

Używam osadzonego serwera Jetty, więc nie mam pliku web.xml do dodania nagłówków.

Może to również mieć związek z tym, jak serwer aplikacji HTML5 (w tym przypadku apache 2.2) obsługuje aplikację.

Apache plik httpd.conf posiada wpis:

LoadModule headers_module modules/mod_headers.so 

<IFModule mod_headers> 
    Header add Access-Control-Allow-Origin "*" 
    Header add Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE, HEAD 
    Header add Access-Control-Allow-Headers: X-PINGOTHER 
    Header add Access-Control-Max-Age: 1728000 
</IfModule> 

w mojej konfiguracji Guice servlet Mam następujący:

public class RestModule extends ServletModule{ 

    @Override 
    protected void configureServlets() { 
     bind(QuestbookService.class); 

     // hook Jersey into Guice Servlet 
     bind(GuiceContainer.class); 

     // hook Jackson into Jersey as the POJO <-> JSON mapper 
     bind(JacksonJsonProvider.class).in(Scopes.SINGLETON); 

     Map<String, String> guiceContainerConfig = new HashMap<String, String>(); 
     guiceContainerConfig.put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, 
      HttpStatusCodeMetricResourceFilterFactory.class.getCanonicalName()); 
     serve("/*").with(GuiceContainer.class, guiceContainerConfig); 
    } 
} 

Myślę, że problem jest w moim Guice config odkąd don nie ma miejsca na ustawienie nagłówków odpowiedzi.

Używam wbudowanego serwera pomostowego i dlatego zorientowałem się, że tryb deweloperski pominie cały czek, ale mogę się mylić.

Dziękuję za radę.

+0

możliwe duplikat [Dlaczego widząc „pochodzenie nie jest dozwolone przez Access-Control-Allow-Origin” błąd tutaj?] (http://stackoverflow.com/questions/9310112/why-am-i-seeing-an-origin-is-not-ileded-by-access-control-allow-origin-error) – Barmar

+0

Moje pytanie jest po stronie serwera, przykład zajmuje się stroną klienta. Biblioteka po stronie klienta już zajmuje się tymi niespójnościami. Jest to problem oparty na serwerze. – AnthonyJClink

+0

Dodano, ponieważ używam wbudowanego serwera z pomostem. Nie jestem pewien, jak skonfigurować bez web.xml ... Wiem, że jest to brak zrozumienia dla technologii. ale uważam, że stos technologii w tym pytaniu jest wystarczająco odmienny od możliwego duplikatu, na który zasługuje jego własna uwaga, ponieważ wiąże się z bardzo różnymi stosami technologii. – AnthonyJClink

Odpowiedz

9

Do szczególnych wymagań mojej aplikacji. Serwer musi być całkowicie zintegrowany z klientem. Klient powinien mieć możliwość połączenia się z serwerem komunikacyjnym za pomocą dowolnej możliwej metody.

Ponieważ pierwsze wdrożenie tej aplikacji będzie oparte na REST, muszę mieć możliwość akceptowania odpoczynku z dowolnego miejsca.

Dodatkowo, potrzebuję kompletnej konfiguracji bezmlmlkowej, więc używam Guice z wbudowanym serwerem Jetty. Ponieważ nie mam pliku web.xml, nie mogłem dowiedzieć się, jak ustawić nagłówki, aby zezwalać na CORS.

Po wielu próbach i błędach oraz przeczytaniu dokumentacji guice, znalazłem sposób dodania nagłówków CORS do odpowiedzi opuszczającej serwer.

Klasa ServletModule Guice pozwala dodawać filtry do kontekstu serwletu. To pozwala, że ​​wszystkie żądania przechodzą przez dany serwlet.

Ponieważ próbuję utworzyć aplikację odpoczynku, która odpowiada na żądania CORS, potrzebowałem filtra, który dodałby nagłówki cors do odpowiedzi na każde żądanie. Teraz odpowiada na wszystkie prośby, ale ostatecznie odpowiem tylko wtedy, gdy warstwa usługi zareaguje kodem odpowiedzi 200 - 300.

tak aby umożliwić Cors w moim wbudowanego serwera przy użyciu Guice Zbudowałem filtr, który wygląda tak:

@Singleton 
public class CorsFilter implements Filter{ 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
    FilterChain filterChain) throws IOException, ServletException { 

     if(response instanceof HttpServletResponse){ 
     HttpServletResponse alteredResponse = ((HttpServletResponse)response); 
     addCorsHeader(alteredResponse); 
    } 

    filterChain.doFilter(request, response); 
    } 

    private void addCorsHeader(HttpServletResponse response){ 
     //TODO: externalize the Allow-Origin 
     response.addHeader("Access-Control-Allow-Origin", "*"); 
     response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD"); 
     response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept"); 
     response.addHeader("Access-Control-Max-Age", "1728000"); 
    } 

    @Override 
    public void destroy() {} 

    @Override 
    public void init(FilterConfig filterConfig)throws ServletException{} 
} 

Guice zapewnia klasę abstrakcyjną, która umożliwia skonfigurowanie Guice serwletu.

moduł

konfiguracja wygląda następująco:

public class RestModule extends ServletModule{ 

    @Override 
    protected void configureServlets() { 
     bind(MyServiceClass.class); 

     // hook Jersey into Guice Servlet 
     bind(GuiceContainer.class); 

     // hook Jackson into Jersey as the POJO <-> JSON mapper 
     bind(JacksonJsonProvider.class).in(Scopes.SINGLETON); 

     Map<String, String> guiceContainerConfig = new HashMap<String, String>(); 

     serve("/*").with(GuiceContainer.class, guiceContainerConfig); 

     filter("/*").through(CorsFilter.class); 
    } 
} 

Teraz Guice doda Cors nagłówki do każdej odpowiedzi. Umożliwienie mojej czystej aplikacji HTML 5, aby z nią rozmawiać, bez względu na to, gdzie jest obsługiwana.

4

Wystarczy umieścić jedną linię w pliku kodu

Response.AddHeader ("Access-Control-Allow-Origin", "*");

Wymień * z http://www.yoursite.com jeśli chcesz zezwolić tylko dla konkretnej domeny

+0

Rozwiązałem to, używając filtra koszulki – AnthonyJClink