rest - razón - no ''access-control-allow-origin'' header is present on the requested resource.
No hay ningún encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado-Resteasy (2)
Estoy trabajando en una aplicación web que comprende UI-Angular, Server-Java, RestEasy 3.0.9.Final para el resto de llamadas a la API
Cuando intenté acceder al servicio de descanso desde otro dominio, obtengo un error por debajo de
NO SE PUEDE CARGAR La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: no hay un encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado. Por lo tanto, el origen '' http: // localhost: 8080 '' no tiene permitido el acceso.
Configuré el lado del servidor para que respondiera con las llamadas de dominio cruzado y esto funciona con la llamada GET, pero la llamada POST está creando ERROR
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>
Clase de servicio
@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();
}
Ya que soy nuevo en inquietud no puedo entender por qué esto no estaba funcionando. Cualquier ayuda sería muy apreciada. Esperando por tu respuesta.
Gracias
Parece que tu método POST
recursos no se verá afectado como @peeskillet menciona. Lo más probable es que su solicitud de ~ POST ~ no funcione, porque puede que no sea una solicitud simple. Las únicas solicitudes simples son GET, HEAD o POST y las cabeceras de solicitud son simples (las únicas cabeceras simples son Aceptar, Aceptar-Idioma, Contenido-Idioma, Contenido-Tipo = aplicación / x-www-form-urlencoded, multipart / form-data , Texto sin formato).
Como ya ha agregado encabezados de Access-Control-Allow-Origin
a su Respuesta, puede agregar un nuevo método OPTIONS
a su clase de recurso.
@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();
}
Sus métodos de recursos no serán afectados, por lo que sus encabezados nunca se establecerán. La razón es que existe lo que se llama una solicitud de verificación previa antes de la solicitud real, que es una solicitud de OPTIONS
. Entonces, el error viene del hecho de que la solicitud de verificación previa no produce los encabezados necesarios.
Para RESTeasy, debe utilizar CorsFilter
. here puedes ver algunos ejemplos de cómo configurarlo. Este filtro manejará la solicitud de verificación previa. Para que pueda eliminar todos los encabezados que tiene en sus métodos de recursos.
Ver también: