Para añadir el soporte CORS a nuestros servicios REST, basta con añadir unas determinadas cabeceras a nuestra respuesta y modificar nuestro método actual para que las añada.
En primer lugar, el tipo de retorno de nuestro método, debe cambiar al tipo Response y deberemos introducir el objeto respuesta dentro de una clase del tipo GenericEntity. En el siguiente ejemplo mostramos cómo quedaría un método así:
import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.Response; ... ... @GET @Path( "/metodo/{param1}/{param2}" ) @Produces( MediaType.APPLICATION_JSON + ";charset=utf-8" ) public Response corsEjemplo( @PathParam( "param1" ) String param1, @PathParam( "param2" ) String param2) { .... GenericEntity entity = new GenericEntity<ClaseObjetoRespuesta>( objetoRespuesta ) {}; return makeCORS( Response.ok( entity ) ); }
El siguiente paso es crear un método para recuperar las opciones del recurso al que estamos accediendo. Este nuevo método se llamará como el anterior pero los parámetros y las anotaciones serán diferentes. A continuación tenéis un ejemplo
private String corsHeaders; ... @OPTIONS @Produces( MediaType.APPLICATION_JSON + ";charset=utf-8" ) @Path( "/metodo/{param1}/{param2}" ) public Response corsEjemplo( @HeaderParam( "Access-Control-Request-Headers" ) String requestH ) { corsHeaders = requestH; return makeCORS( Response.ok(), requestH ); }
A continuación debemos implementar el método makeCORS que es el que añadirá las cabeceras necesarias. El código es el siguiente:
private Response makeCORS( ResponseBuilder req ) { return makeCORS( req, corsHeaders ); } private Response makeCORS( ResponseBuilder req, String returnMethod ) { ResponseBuilder rb = req.header( "Access-Control-Allow-Origin", "*" ).header( "Access-Control-Allow-Methods", "GET, POST, OPTIONS" ); if ( !"".equals( returnMethod ) ) { rb.header( "Access-Control-Allow-Headers", returnMethod ); } return rb.build(); }