====== Soporte CORS para servicios REST ======
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( 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();
}