19/12/2019, 14:24
|
| | | Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 10 años, 5 meses Puntos: 0 | |
Respuesta: Error con CORS en API REST Cita:
Iniciado por prueba230683 Con el código que muestras, solamente estás enviando las cabeceras de CORS cuando el método de la petición es POST.
También debes enviar todas esas cabeceras cuando el método es OPTIONS, ya que el navegador hace una petición de prueba o preflight (con el método OPTIONS) antes de realizar la petición POST definitiva.
La solución es utilizar un filtro como este: https://stackoverflow.com/a/36619749
Editándolo un poco, si quieres dar acceso a cualquier dominio puedes crear la siguiente clase ResponseCorsFilter:
Código Java:
Ver originalimport javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.Provider; import java.io.IOException; public class ResponseCorsFilter implements ContainerResponseFilter { @Override public void filter (ContainerRequestContext requestContext, ContainerResponseContext responseContext ) throws IOException { MultivaluedMap <String, Object > responseHeaders = responseContext. getHeaders(); String origin = requestContext. getHeaderString("Origin"); responseHeaders.putSingle("Access-Control-Allow-Origin", origin); responseHeaders.putSingle("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE, HEAD"); responseHeaders.putSingle("Access-Control-Allow-Credentials", "true"); String reqHead = requestContext. getHeaderString("Access-Control-Request-Headers"); if (null != reqHead && !reqHead.equals("")) { responseHeaders.putSingle("Access-Control-Allow-Headers", reqHead); } } }
Por otra parte, para que dicho filtro funcione debes editar el fichero web.xml de tu servidor.
En el web.xml debes añadir dentro de la etiqueta <web-app> lo siguiente:
Código XML:
Ver original<filter> <filter-name>miFiltro</filter-name> <filter-class>ResponseCorsFilter</filter-class> </filter> <filter-mapping> <filter-name>miFiltro</filter-name> <url-pattern>/aqui/la/ruta/del/api</url-pattern> </filter-mapping>
Simplemente debes reemplazar "/aqui/la/ruta/del/api" por la ruta de tu API donde quieres que se incluyan las cabeceras de CORS.
Gracias por tu respuesta, intente eso pero ahora no me levanta el WAR y da este error
Código:
19/12/2019 05:22:24 PM org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer addServletWithApplication
INFO: Registering the Jersey servlet application, named servicios.ApplicationConfig, at the servlet mapping /webresources/*, with the Application class of the same name.
19/12/2019 05:22:24 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
19/12/2019 05:22:24 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Thu Dec 19 17:22:24 GMT-03:00 2019]; root of context hierarchy
19/12/2019 05:22:24 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml]
19/12/2019 05:22:24 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 310 ms
19/12/2019 05:22:24 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Error filterStart
19/12/2019 05:22:24 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Falló en arranque del Contexto [/rest2] debido a errores previos
19/12/2019 05:22:24 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing Root WebApplicationContext: startup date [Thu Dec 19 17:22:24 GMT-03:00 2019]; root of context hierarchy
Mi web.xml es
Código XML:
Ver original<filter> <filter-name>miFiltro</filter-name> <filter-class>ResponseCorsFilter</filter-class> </filter> <filter-mapping> <filter-name>miFiltro</filter-name> <url-pattern>/login</url-pattern> </filter-mapping>
|