2015-12-09 8 views
6

Ich verwende Ionic und Spring Boot 1.3. Es war nicht, bis ich auf 1.3 aktualisiert habe, dass ich dieses Problem bekomme ...Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Ionic, AngularJS, Spring Boot 1.3

Offenbar nach dem Update auf Spring Boot 1.3. CorsFilter wird vollständig ignoriert. All diese Missachtung macht mich verrückt. Also habe ich den NEUEN Weg nachgeschaut und das habe ich bekommen.

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"); 
    } 
} 

Der obige Code wird auf dem Start der Anwendung ausgeführt. Im Gegensatz zu CorsFilter, die jedes Mal ausgeführt wird, wenn eine Anfrage vorliegt. Aber zu Spring Boot 1.3 wechseln, kann ich das nicht mehr im Kettenfilter bekommen.

Wieder wird der Code geladen, ich setze einen Haltepunkt und addCorsMapping wird jedes Mal aufgerufen, damit die Einstellungen vorgenommen werden. So .... Warum bin ich immer noch diesen Fehler

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 Unten ist mein alter CorsFilter. Es funktioniert nicht mehr, seit ich auf Spring Boot 1.3 aktualisiert habe.

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() { 
    } 

} 

Antwort

5

Ich habe es herausgefunden. Ich verwende eine CustomToken-Anmeldung und aus irgendeinem Grund Die neuen Konfigurationen für 1.3 und höher setzen die Antwort nicht mit Access-Control-Allow-Origin, wenn benutzerdefinierte Login-Authentifizierung verwendet wird. Irgendwo in meinem benutzerdefinierten Login musste ich den Antwort-Header hinzufügen.

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

In älteren Versionen des Frühlings wird die CorsFilter im Filter so eingestellt, dass es auf diese jedesmal, wenn ein Anruf getätigt wird eingestellt würde. Es scheint, dass die neuen Konfigurationen nur funktionieren, wenn ein Controller ordnungsgemäß aufgerufen wird, aber da die Anmeldung in den Filtern und nicht in einem Controller erfolgt, wird der Antworttext nie festgelegt. Er authentifiziert den Benutzer richtig Access-Control-Allow-Origin

6

Sie können so etwas versuchen. Es funktioniert für mich:

@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

Danke für die Antwort. Vor dem Aktualisieren auf 1.3 Spring Boot. Ich hatte so etwas und es funktionierte perfekt. Seit ich auf Spring Boot 1.3 aktualisiert habe, wird es jetzt komplett ignoriert. deshalb habe ich das neuere Setup hinzugefügt. Ich habe oben meinen CorsFilter hinzugefügt. Es ist ähnlich wie Ihre, aber ich bekomme den Ursprung der IP und setze es auf die Zugriffskontrolle. In jedem Fall wird die Datei vollständig ignoriert, was bedeutet, dass keine Einstellungen vorgenommen werden. Ich möchte auch hinzufügen, dass ich WebSocket-Layer verwende, die den Astrick-Wert nicht erlaubt. – numerical25

+0

sogar für mich funktioniert der gleiche Filter –

1

In einer meiner Open-Source-Projekt, das ich von CORS Unterstützung Frühjahr vor dem das Update erforderlich 4.2 ich einen Filter wie folgt verwendet:

@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() {} 

} 

als Answare von Raca. Jedoch, wenn ich im Frühjahr-Boot 1.3.3 aktualisieren änderte ich die Konfiguration wie folgt:

@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("/**"); 
      } 
     }; 
    } 
} 

dies von der Haupt Konfiguration meines Projektes genommen wird und diese Art der Konfiguration funktioniert gut für mich selbst in einem komplexen verteilten System mit Netflix API der Frühlingswolke.

Ich hoffe, dass dies Ihnen helfen kann.

Verwandte Themen