¿Qué es el uso compartido de recursos de origen cruzado (CORS)? ¿Cómo agregarlo a su servidor web Java Jersey?
Publicado: 2014-07-19 ¿Cómo solucionar este error durante la comunicación client-server
? El servidor envía datos en formato JSON o XML y el cliente lanza la siguiente excepción.
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
Las páginas web normales pueden usar el objeto XMLHttpRequest para enviar y recibir datos de servidores remotos, pero están limitadas por la misma política de origen. Las extensiones no son tan limitadas. Una extensión puede comunicarse con servidores remotos fuera de su origen, siempre que primero solicite permisos de origen cruzado.
Además, si tiene las siguientes preguntas, entonces se encuentra en la ubicación correcta:
- Comprender el uso compartido de recursos de origen cruzado (filtros CORS)
- ¿Puedo usar el uso compartido de recursos de origen cruzado?
- Cómo habilitar el uso compartido de recursos de origen cruzado
- ¿Qué es Ajax de dominio cruzado con intercambio de recursos de origen cruzado?
- ¿Qué es el control de acceso HTTP (CORS)?
CORS (intercambio de recursos de origen cruzado) es un mecanismo compatible con W3C para permitir solicitudes de origen cruzado en navegadores web. CORS requiere soporte tanto del navegador como del servidor para funcionar. Esta es una implementación de filtro de servidor web Java Jersey de CORS del lado del servidor para contenedores web como Apache Tomcat y otros servidores web integrados.
Paso 1:
Una respuesta puede incluir un encabezado Access-Control-Allow-Origin, con el origen de donde se originó la solicitud como el valor, para permitir el acceso al contenido del recurso. El agente de usuario valida que el valor y el origen de donde se originó la solicitud coincidan.
Paso 2:
Los agentes de usuario pueden descubrir a través de una solicitud de verificación previa si un recurso de origen cruzado está preparado para aceptar solicitudes, utilizando un método no simple, de un origen determinado. Esto es nuevamente validado por el agente de usuario.
Paso 3:
Las aplicaciones del lado del servidor están habilitadas para descubrir que una solicitud HTTP fue considerada una solicitud de origen cruzado por el agente de usuario, a través del encabezado Origin. Esta extensión permite que las aplicaciones del lado del servidor apliquen limitaciones (por ejemplo, no devolver nada) en las solicitudes de origen cruzado que están dispuestas a atender.
Ahora comencemos con ejemplos.
Ejemplo-1: servidor web Java Jersey
Hace un par de semanas escribí un artículo sobre cómo iniciar el servidor Jersey HTTP integrado durante el inicio de la aplicación Java. Esta publicación cubrirá los pasos sobre cómo agregar el filtro CORS al mismo servidor de Jersey.
Necesitamos extender ContainerResponseFilter. Interfaz implementada por filtros de respuesta de contenedor. Por defecto, es decir, si no se aplica ningún enlace de nombre a la clase de implementación del filtro, la instancia del filtro se aplica globalmente a cualquier respuesta saliente.
Para que esto se solucione, intentemos agregar debajo de 4 encabezados a la respuesta del servidor:
- Acceso-Control-Permitir-Origen
- Acceso-Control-Permitir-Métodos
- Access-Control-Max-Age
- Acceso-Control-Permitir-Encabezados
Código de filtro CORS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
Modificación en JerseyEmbeddedHTTPServerCrunchify.java del tutorial anterior.

Simplemente agregue la siguiente línea en createHttpServer() y reinicie el servidor.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Resultado:
http://localhost:8085/api
Aquí hay detalles de encabezados.
Ejemplo-2: servidor Apache HTTP
Para exponer el encabezado, puede agregar la siguiente línea dentro de las secciones <Directorio>, <Ubicación> y <Archivos>, o dentro de un archivo .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Ejemplo-3: el servidor .NET puede configurar esto en web.config como se muestra a continuación
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Ejemplo-4: Para Jetty (7 y superior)
Incluya el JAR de jetty-servlets en su WEB-INF/lib y combínelo en su WEB-INF/web.xml
1 2 3 4 5 6 7 8 |
< filter > < filter - name > cross - origin < / filter - name > < filter - class > org . eclipse . jetty . servlets . CrossOriginFilter < / filter - class > < / filter > < filter - mapping > < filter - name > cross - origin < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
Ejemplo-5: Servidor Apache Tomcat (v 7.0.41 +)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
Ejemplo-6: En PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Por favor, hágamelo saber si tiene más preguntas sobre esto. La lista de todos los tutoriales de Java se encuentra aquí.