0
votes

WebTestClient - Cors avec botte à ressort et webflux

J'ai Vuejs frontend et un contrôleur Webflux de démarrage à ressort. Maintenant, le navigateur se plaint de Cors lors du démarrage de printemps.

Accès à XMLHTTPQUEST à 'https: // ...' de l'origine 'https: // ...' a été bloqué par Cors Politique: la réponse à la demande de pré-lumière ne passe pas la vérification du contrôle d'accès: Aucune en-tête «Access-Control-Autory-Origin» est présente sur la ressource demandée.

Pour activer Cors, j'ai essayé d'utiliser L'annotation @crossorigin telle que décrite ici: https://www.baeldung.com/spring-webflux- cors

mais cela n'a pas aidé et d'une manière ou d'une autre, le ressort n'envoie pas les en-têtes Cors dans la réponse même avec l'annotation @crossorigin dans le contrôleur.

i essayé avec le WebTestClient comme décrit dans le tutoriel Bealdung et confirme que l'en-tête n'est pas là: xxx

si je teste avec réponse.extheader (" Access-Control-Autory-Origine "); Je reçois: xxx

aucune idée desquelles la configuration de Cors comme décrit dans le lien ci-dessus ne fonctionne pas? J'ai également essayé de permettre à Cors de la configuration globale et de permettre à des cors avec une webfilter. Mais rien ne semble fonctionner.


0 commentaires

3 Réponses :


0
votes

dans le Javadocs du @crossorigin code> Il y a mentionner

Webflux de Spring Web MVC et Spring Webfflux prennent en charge cette annotation à travers la demande deappartHermermer dans leurs modules respectifs. le Les valeurs de chaque type et de la paire d'annotations de niveau de méthode sont ajoutées à une corsconfiguration p> blockQuote>

ce qui signifie que vos paramètres Cors seront ajoutés à Corsconfiguration p>

Si vous utilisez la sécurité de printemps, vous devez Activer CORS afin que votre corsconfiguration soit utilisée. Voir ci-dessous un petit exemple p> xxx pré>

de la Javadocs P>

Ajoute un corsfilter à utiliser. Si un haricot par le nom de Corsfilter est fourni, que Corsfilter est utilisé. Sinon si corsconfigurationverce est défini, alors cette corsconfiguration est utilisée. Sinon, si le printemps mvc est sur le pavé de classe d'un manuelIntrospector utile. P> BlockQuote>

Remarque, si vous envoyez des informations d'identification avec la demande (cookies), vous devez l'ajouter à vos paramètres de Cors P>

@CrossOrigin(allowCredentials = "true")


2 commentaires

Merci beaucoup pour votre réponse. Après l'avoir lu attentivement et lisez aussi la documentation que j'ai toujours le même problème. En fait, je n'utilise pas la sécurité du printemps. Une dernière chose: exécuter le test donne également cette erreur: 2020-07-04 13: 44: 45.611 Erreur 17867 --- [Parallel-1] oswsadapter.httpwebhandleradapter: [38a66881] 500 Erreur de serveur pour HTTP GET " / CORS-Ending-EndPoint " Java.lang.illegalargumentException: la demande réelle ne doit pas être null Ce pourrait être la cause fondamentale, mais je ne trouve pas d'aide aux ressources sur Internet. Pouvez-vous aider?


@RICHART Assurez-vous de mettre Crossorigin sur exactement le même mappage de demande que vous envoyez la demande à. Si vous mettez Crossorigin sur GET "/ API / utilisateurs", les CORS ne seront activés que pour obtenir "/ API / utilisateurs". Vous pouvez également mettre Crossorigin sur le niveau du contrôleur, puis CORS sera disponible pour toutes les mappages de demande dans le contrôleur E.G. Post "/ API / utilisateurs" Obtenez "/ API / utilisateurs", etc. Et bien sûr, il dépendra des méthodes que vous avez autorisées dans la configuration de Cors dans le contrôleur.



0
votes

La solution consistait à utiliser la configuration suivante pour le WebTestClient:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>


0 commentaires

0
votes

Pour moi, ce qui a effectivement travaillé sans ajouter la dépendance de Spring-Starter-Web, c'était d'utiliser un filtre Web et une force de force si la méthode HTTP est Options forte>.

@Configuration
public class CorsGlobalConfiguration implements WebFilter {


@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange,
                         WebFilterChain webFilterChain) {
    ServerHttpRequest request = serverWebExchange.getRequest();
    ServerHttpResponse response = serverWebExchange.getResponse();
    HttpHeaders headers = response.getHeaders();
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
    headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
    headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "18000L");
    if (request.getMethod() == HttpMethod.OPTIONS) {
        response.setStatusCode(HttpStatus.OK);
        return Mono.empty();//HERE
    }
    return webFilterChain.filter(serverWebExchange);
}


}


0 commentaires