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.