web-dev-qa-db-fra.com

Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée - Resteasy

Je travaille sur une application Web comprenant UME-Angular, Server-Java et RestEasy 3.0.9.Final pour les appels api restants

Lorsque j'essaie d'accéder au service de repos d'un autre domaine, je reçois une erreur ci-dessous.

CANNOT LOAD La réponse à la demande de contrôle en amont ne réussit pas le contrôle de contrôle d'accès: aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée. Origin ' http: // localhost: 8080 ' n'est donc pas autorisé à accéder.

J'ai configuré mon côté serveur pour répondre aux appels interdomaines et cela fonctionne avec l'appel GET mais POST Call crée une ERREUR.

web.xml

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.test.sample.app.CorsFeature</param-value>
</context-param>

<listener>
    <listener-class>
        org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>


<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.test.sample.app.Application</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/rest</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>

Classe de service

@GET
@Path("/getnameAtt")
@Produces(MediaType.APPLICATION_JSON)
public Response getHostnameAttributes() {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
        "Origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
        "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getHostNameAttributes())
.build();
}

@POST
@Path("/getSeq")
@Produces(MediaType.APPLICATION_JSON)
public Response getCurrentSequence(String request) {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
        "Origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
        "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getCurrentSeq(request))
.build();
}

Depuis que je suis nouveau à Resteasy pas en mesure de comprendre pourquoi cela ne fonctionnait pas . Toute aide serait grandement appréciée. J'attend votre réponse.

Merci

20
PremKumarR

Vos méthodes de ressources ne seront pas touchées et leurs en-têtes ne seront jamais configurés. La raison en est qu'il existe ce qu'on appelle une demande de contrôle en amont avant la demande réelle, qui est une demande OPTIONS. Donc, l'erreur vient du fait que la demande de contrôle en amont ne produit pas les en-têtes nécessaires.

Pour RESTeasy, vous devez utiliser CorsFilter . Vous pouvez voir ici pour quelques exemples comment le configurer. Ce filtre traitera la demande de contrôle en amont. Ainsi, vous pouvez supprimer tous les en-têtes que vous avez dans vos méthodes de ressources. 

Voir également:

11
Paul Samsotha

Il semble que votre ressource POSTmethod ne soit pas touchée par la mention @peeskillet. Il est fort probable que votre demande ~ POST ~ ne fonctionnera pas, car ce ne sera peut-être pas une demande simple. Les seules demandes simples sont GET, HEAD ou POST et les en-têtes de demande sont simples (les seuls en-têtes simples sont Accepter, Accepter-Langue, Contenu-Langue, Contenu-Type = application/x-www-form -urlencoded, multipart/form-data, text/plain).

Comme vous avez déjà ajouté des en-têtes Access-Control-Allow-Origin à votre réponse, vous pouvez ajouter une nouvelle méthode OPTIONS à votre classe de ressources.

    @OPTIONS
@Path("{path : .*}")
public Response options() {
    return Response.ok("")
            .header("Access-Control-Allow-Origin", "*")
            .header("Access-Control-Allow-Headers", "Origin, content-type, accept, authorization")
            .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
            .header("Access-Control-Max-Age", "2000")
            .build();
}
0
Ranuka