Ver Mensaje Individual
  #8 (permalink)  
Antiguo 19/12/2019, 07:32
prueba230683
 
Fecha de Ingreso: abril-2011
Mensajes: 170
Antigüedad: 13 años
Puntos: 68
Respuesta: Error con CORS en API REST

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.

Última edición por prueba230683; 19/12/2019 a las 13:18