2015-12-09 9 views
6

Używam Ionic i Spring Boot 1.3. Dopiero zaktualizowałem do wersji 1.3, że otrzymuję ten problem ...Na żądanym zasobie nie ma nagłówka "Access-Control-Allow-Origin". Ionic, AngularJS, Spring Boot 1.3

Najwyraźniej po aktualizacji do Spring Boot 1.3. CorsFilter jest całkowicie ignorowany. Cała ta deprecjacja doprowadza mnie do szału. Więc spojrzałem na NOWĄ drogę i to jest to, co otrzymałem.

package app.config; 

import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.CorsRegistry; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addCorsMappings(CorsRegistry registry) { 
     registry.addMapping("/**") 
       .allowedOrigins("http://192.168.1.66:8101") 
       .allowCredentials(false) 
       .maxAge(3600) 
       .allowedHeaders("Accept", "Content-Type", "Origin", "Authorization", "X-Auth-Token") 
       .exposedHeaders("X-Auth-Token", "Authorization") 
       .allowedMethods("POST", "GET", "DELETE", "PUT", "OPTIONS"); 
    } 
} 

Powyższy fragment kodu jest sprawdzony podczas uruchamiania aplikacji. W przeciwieństwie do CorsFilter, który jest wykonywany za każdym razem, gdy istnieje żądanie. Ale przełączając się na Spring Boot 1.3, nie mogę już dostać tego w filtrze łańcuchowym.

Ponownie, kod jest ładowany, ustawiam punkt przerwania i dodamCorsMapping jest wywoływany za każdym razem, więc ustawienia są wprowadzane. Tak .... Dlaczego jestem wciąż otrzymuję ten błąd

XMLHttpRequest cannot load http://192.168.1.66:8080/login?username=billyjoe&password=happy. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.1.66:8101' is therefore not allowed access. 

EDIT Poniżej jest mój stary CorsFilter. Nie działa już od czasu aktualizacji do wersji Spring Boot 1.3

package app.config; 

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 

@Component 
public class CorsFilter implements Filter { 

    private final Logger log = LoggerFactory.getLogger(CorsFilter.class); 

    public CorsFilter() { 
     log.info("SimpleCORSFilter init"); 
    } 

    @Override 
    public void doFilter(ServletRequest req, 
         ServletResponse res, 
         FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String clientOrigin = request.getHeader("origin"); 
     response.addHeader("Access-Control-Allow-Origin", clientOrigin); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, PUT"); 
     response.setHeader("Access-Control-Allow-Credentials", "true"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Origin, Authorization, X-Auth-Token"); 
     response.addHeader("Access-Control-Expose-Headers", "X-Auth-Token"); 

     if (request.getMethod().equals("OPTIONS")) { 
      response.setStatus(HttpServletResponse.SC_OK); 
     } else { 
      chain.doFilter(request, response); 
     } 
    } 

    @Override 
    public void init(FilterConfig filterConfig) { 
    } 

    @Override 
    public void destroy() { 
    } 

} 

Odpowiedz

5

Wyliczyłem to. Używam logowania użytkownika niestandardowego i z jakiegoś powodu Nowe konfiguracje dla wersji 1.3 i nowszych nie ustawiają odpowiedzi przy użyciu funkcji Access-Control-Allow-Origin podczas używania niestandardowego uwierzytelniania logowania. Więc gdzieś w moim niestandardowym logowaniu musiałem dodać nagłówek odpowiedzi.

httpServletResponse.addHeader("Access-Control-Allow-Origin", "http://192.168.1.66:8080"); 

W starszych wersjach sprężyny filtr CorsFilter jest ustawiony w filtrze, dzięki czemu można go ustawić za każdym razem, gdy wykonywane jest połączenie. Wygląda na to, że New Configs działają tylko poprawnie wywołując kontroler, ale ponieważ logowanie odbywa się w filtrach, a nie w kontrolerze, ciało odpowiedzi nigdy nie jest ustawione. To właściwie uwierzytelnia użytkownika Access-Control-Allow-Origin

6

Możesz wypróbować coś takiego. To działa dla mnie :.

@Component 
public class SimpleCORSFilter implements Filter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     chain.doFilter(req, res); 
    } 

    public void init(FilterConfig filterConfig) {} 

    public void destroy() {} 

} 
+0

Dzięki za odpowiedź. Przed aktualizacją do 1.3 Spring Boot. Miałem coś takiego i to działało idealnie. Od czasu aktualizacji do wersji Spring Boot 1.3 całkowicie ignoruje ją teraz. dlatego dodałem nowszą konfigurację. Dodałem mój CorsFilter powyżej. Jest podobny do twojego, z wyjątkiem tego, że dostaję pochodzenie IP i ustawię go na kontrolę dostępu pozwalającą na początek. W każdym przypadku plik jest całkowicie ignorowany, co oznacza, że ​​żadne ustawienia nie są stosowane. Chciałbym również dodać, że używam warstwy WebSocket, która nie pozwala na wartość astrick. – numerical25

+0

nawet dla mnie działa ten sam filtr –

1

W moim projekcie open source I potrzebnego wsparcia Cors befor aktualizacji do wiosny 4.2 użyłem filtr tak:

@Component 
public class SimpleCORSFilter implements Filter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     chain.doFilter(req, res); 
    } 

    public void init(FilterConfig filterConfig) {} 

    public void destroy() {} 

} 

jako answare z Raczy. Jednak kiedy aktualizować na wiosnę-boot 1.3.3 Zmieniłem konfigurację jak poniżej:

@SpringBootApplication 
@Configuration 
@EnableEurekaClient 
@RibbonClients 
@EnableCircuitBreaker 
@EnableZuulProxy 
@EnableJpaRepositories(basePackages = "it.valeriovaudi.documentlibrary.repository") 
@EnableTransactionManagement 
@EnableRedisHttpSession 
@PropertySource("classpath:restBaseUrl.properties") 
@EnableAspectJAutoProxy(proxyTargetClass = true) // without this declaration the RestTemplate injection wil be fails becouse spring cloud proxied this class for load balance with netflix ribbon 
public class UserDocumentLibraryClientApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(UserDocumentLibraryClientApplication.class, args); 
    } 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurerSupport() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public EmbeddedServletContainerCustomizer exceptionHandling() { 
     return container -> container.addErrorPages(new ErrorPage("/exception")); 
    } 

    @Bean 
    public WebMvcConfigurer corsConfigurer() { 
     return new WebMvcConfigurerAdapter() { 
      @Override 
      public void addCorsMappings(CorsRegistry registry) { 
       registry.addMapping("/**"); 
      } 
     }; 
    } 
} 

ta jest pobierana z głównego konfiguracji mojego projektu i tego rodzaju konfiguracji działa dobrze dla mnie nawet w złożonym systemie rozproszonym z api netflix z chmury wiosennej.

Mam nadzieję, że to może ci pomóc.

Powiązane problemy