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
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:
Il semble que votre ressource POST
method 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();
}