Ver Mensaje Individual
  #9 (permalink)  
Antiguo 19/12/2019, 14:24
Avatar de Hyemin
Hyemin
 
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Error con CORS en API REST

Cita:
Iniciado por prueba230683 Ver Mensaje
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 original
  1. import javax.ws.rs.container.ContainerRequestContext;
  2. import javax.ws.rs.container.ContainerResponseContext;
  3. import javax.ws.rs.container.ContainerResponseFilter;
  4. import javax.ws.rs.core.MultivaluedMap;
  5. import javax.ws.rs.ext.Provider;
  6. import java.io.IOException;
  7.  
  8. public class ResponseCorsFilter implements ContainerResponseFilter {
  9.  
  10.     @Override
  11.     public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
  12.  
  13.         MultivaluedMap<String, Object> responseHeaders = responseContext.getHeaders();
  14.         String origin = requestContext.getHeaderString("Origin");
  15.  
  16.         responseHeaders.putSingle("Access-Control-Allow-Origin", origin);
  17.         responseHeaders.putSingle("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE, HEAD");
  18.         responseHeaders.putSingle("Access-Control-Allow-Credentials", "true");
  19.  
  20.         String reqHead = requestContext.getHeaderString("Access-Control-Request-Headers");
  21.  
  22.         if (null != reqHead && !reqHead.equals("")) {
  23.                 responseHeaders.putSingle("Access-Control-Allow-Headers", reqHead);
  24.         }
  25.     }
  26. }

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
  1. <filter>
  2.         <filter-name>miFiltro</filter-name>
  3.         <filter-class>ResponseCorsFilter</filter-class>
  4. </filter>
  5.  
  6. <filter-mapping>
  7.         <filter-name>miFiltro</filter-name>
  8.         <url-pattern>/aqui/la/ruta/del/api</url-pattern>
  9. </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
  1. <filter>
  2.         <filter-name>miFiltro</filter-name>
  3.         <filter-class>ResponseCorsFilter</filter-class>
  4. </filter>
  5.  
  6. <filter-mapping>
  7.         <filter-name>miFiltro</filter-name>
  8.         <url-pattern>/login</url-pattern>
  9. </filter-mapping>