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<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();
    }