Aggiornamento: Ora ripenso a più di un anno dopo, sto dando un aggiornamento sperando che possa aiutare qualcun altro.Errore di avvio di primavera Problema di supporto Global CORS: solo GET funziona, POST, PUT e Delete non funzionano
Spring IO consiglia di utilizzare la protezione CSRF per qualsiasi richiesta che possa essere elaborata da un browser da parte di utenti normali. Se si sta solo creando un servizio che viene utilizzato da client non-browser, è probabile che si desideri disabilitare la protezione CSRF. Poiché la mia app è un'API e verrà elaborata da un browser, quindi disabilitare CSRF non è un approccio.
CSRF è abilitato con Spring Boot per impostazione predefinita, è necessario aggiungere il seguente codice per aggiungere un repository CSRF e un filtro per aggiungere il token CSRF alle proprie richieste http. (La soluzione viene da qui Invalid CSRF Token in POST request)
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/assets/**", "/templates/**", "/custom-fonts/**", "/api/profile/**", "/h2/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.permitAll()
.and()
.csrf().csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class); // Register csrf filter.
}
Il filtro & CsrfToken Repository parte:
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
// Token is being added to the XSRF-TOKEN cookie.
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
domanda originale ho chiesto di nuovo nel febbraio 2016
ho lavorare sul enabeing Global Supporto CORS per un'API RESTful Spring-boot con Spring 4.
Seguo il Doc ufficiale Primavera Boot (https://spring.io/guides/gs/rest-service-cors/) e hanno aggiunto questo al mio Applicazione:
public class SomeApiApplication {
public static void main(String[] args) {
SpringApplication.run(SomeApiApplication.class, args);
}
//Enable Global CORS support for the application
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
.allowedHeaders("header1", "header2") //What is this for?
.allowCredentials(true);
}
};
}
}
Non capisco il motivo per cui si ottiene solo sta lavorando, per il resto delle chiamate HTTP, sto ottenendo un messaggio di errore che dice "Richiesta CORS non valida". Mi manca qualcosa nel set up? Se il mio set up non è corretto, GET non dovrebbe funzionare altrettanto bene. Sono molto confuso.
tenta di registrare configurazione XML – Abdelhak
Sto usando postino alla prova. Per le intestazioni delle mie richieste, ho l'autorizzazione e il tipo di contenuto. Mi chiedo se è necessario inserire qualche intestazione aggiuntiva per CORS? –
@Abdelhak: Sto usando Spring 4, non dovrei avere alcun codice XML nel mio codice. –