2015-12-09 15 views
6

Sto usando Ionic e Spring Boot 1.3. Non è stato fino a quando ho aggiornato a 1.3 che sto ricevendo questo problema ...Nessuna intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta. Ionic, AngularJS, Spring Boot 1.3

Apparentemente dopo l'aggiornamento a Spring Boot 1.3. CorsFilter viene completamente ignorato. Tutta questa deprecazione mi sta facendo impazzire. Così ho cercato il modo NUOVO e questo è quello che ho ottenuto.

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

Il codice di cui sopra viene inserito nel boot dell'applicazione. A differenza di CorsFilter che viene eseguito ogni volta che viene richiesta. Ma passando a Spring Boot 1.3, non riesco più a ottenere questo nel filtro della catena.

Ancora una volta, il codice viene caricato, ho impostato un punto di interruzione e addCorsMapping viene chiamato ogni volta in modo che le impostazioni vengano effettuate. Quindi .... Perché sono ancora ricevendo questo errore

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 Di seguito è riportato il mio vecchio CorsFilter. Non funziona più da quando ho aggiornato a 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() { 
    } 

} 

risposta

5

Capito. Sto utilizzando un accesso CustomToken e per qualche motivo Le nuove configurazioni per 1.3 e successive non impostano la risposta con Access-Control-Allow-Origin quando si utilizza l'autenticazione di accesso personalizzata. Quindi da qualche parte nel mio login personalizzato ho dovuto aggiungere l'intestazione della risposta.

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

Nelle versioni precedenti di Primavera, il CorsFilter è impostato nel filtro quindi sarebbe impostare questo ogni volta che si effettua una chiamata. Sembra che la nuova configurazione funzioni solo quando si chiama correttamente un controller, ma poiché il login viene gestito nei filtri e non in un controller, il corpo della risposta non viene mai impostato. Autentica correttamente l'utente Access-Control-Allow-Origin

6

Si può provare qualcosa di simile. Sta funzionando per me:

@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

Grazie per la risposta. Prima di aggiornare a 1.3 Spring Boot. Ho avuto qualcosa di simile e ha funzionato perfettamente. Da quando ho aggiornato a Spring Boot 1.3, lo ignora completamente ora. questo è il motivo per cui ho aggiunto la configurazione più recente. Ho aggiunto il mio CorsFilter sopra. È simile al tuo, tranne che ottengo l'origine dell'IP e l'ho impostato su Access Control Allow Origin. In ogni caso, il file viene completamente ignorato, il che significa che non vengono mai applicate impostazioni. Vorrei anche aggiungere che sto usando il livello WebSocket che non consente il valore astrick. – numerical25

+0

anche per me funziona lo stesso filtro –

1

In un mio progetto open source avevo bisogno di supporto CORS befor l'aggiornamento alla primavera 4.2 ho usato un filtro come questo:

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

} 

come Answare di Raca. Tuttavia quando aggiorno a primavera-boot 1.3.3 ho cambiato la configurazione, come di seguito:

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

questo è preso dalla configurazione principale del mio progetto e questo tipo di configurazione funziona bene per me, anche in un sistema distribuito complesso con netflix api di Spring cloud.

Spero che questo possa aiutarti.

Problemi correlati