O que é Cross-Origin Resource Sharing (CORS) – Como adicioná-lo ao seu Java Jersey Web Server?
Publicados: 2014-07-19 Como corrigir esse erro durante a comunicação client-server
? O servidor envia dados no formato JSON ou XML e o cliente lança a exceção abaixo.
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 . |
Páginas da Web comuns podem usar o objeto XMLHttpRequest para enviar e receber dados de servidores remotos, mas são limitadas pela mesma política de origem. As extensões não são tão limitadas. Uma extensão pode se comunicar com servidores remotos fora de sua origem, desde que primeiro solicite permissões de origem cruzada.
Além disso, se você tiver perguntas abaixo, você está no local correto:
- Noções básicas sobre o compartilhamento de recursos entre origens (filtros CORS)
- Posso usar o Compartilhamento de Recursos de Origem Cruzada
- Como habilitar o compartilhamento de recursos entre origens
- O que é Ajax entre domínios com compartilhamento de recursos entre origens
- O que é controle de acesso HTTP (CORS)
CORS (Cross Origin Resource Sharing) é um mecanismo suportado pelo W3C para permitir solicitações de origem cruzada em navegadores da web. CORS requer suporte do navegador e do servidor para funcionar. Esta é uma implementação de filtro Java Jersey Web Server do CORS do lado do servidor para contêineres da Web, como Apache Tomcat e outros servidores da Web incorporados.
Passo 1:
Uma resposta pode incluir um cabeçalho Access-Control-Allow-Origin, com a origem de onde a solicitação se originou como o valor, para permitir o acesso ao conteúdo do recurso. O agente do usuário valida se o valor e a origem de onde a solicitação foi originada correspondem.
Passo 2:
Os agentes de usuário podem descobrir por meio de uma solicitação de comprovação se um recurso de origem cruzada está preparado para aceitar solicitações, usando um método não simples, de uma determinada origem. Isso é novamente validado pelo agente do usuário.
Etapa 3:
Os aplicativos do lado do servidor são habilitados para descobrir que uma solicitação HTTP foi considerada uma solicitação de origem cruzada pelo agente do usuário, por meio do cabeçalho Origem. Essa extensão permite que aplicativos do lado do servidor imponham limitações (por exemplo, não retornando nada) nas solicitações de origem cruzada que eles desejam atender.
Agora vamos começar com Exemplos.
Exemplo-1: Servidor Web Java Jersey
Algumas semanas atrás, escrevi um artigo sobre Como iniciar o servidor HTTP Jersey incorporado durante a inicialização do aplicativo Java. Esta postagem abordará as etapas sobre como adicionar o filtro CORS ao mesmo servidor Jersey.
Precisamos estender ContainerResponseFilter. Interface implementada por filtros de resposta de contêiner. Por padrão, ou seja, se nenhuma ligação de nome for aplicada à classe de implementação do filtro, a instância do filtro será aplicada globalmente a qualquer resposta de saída.
Para que isso seja corrigido, vamos tentar adicionar abaixo 4 cabeçalhos à resposta do servidor:
- Acesso-Controle-Permitir-Origem
- Métodos de controle de acesso-permissão
- Acesso-Controle-Max-Idade
- Cabeçalhos-Controle-Acesso-Permitir-
Código do 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 ; } } |
Modificação em JerseyEmbeddedHTTPServerCrunchify.java do tutorial anterior.

Basta adicionar a linha abaixo em createHttpServer() e reiniciar o servidor.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Resultado:
http://localhost:8085/api
Aqui estão os detalhes dos cabeçalhos.
Exemplo-2: Servidor HTTP Apache
Para expor o cabeçalho, você pode adicionar a seguinte linha dentro das seções <Directory>, <Location> e <Files>, ou dentro de um arquivo .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Exemplo-3: O servidor .NET pode configurar isso em web.config como abaixo
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Exemplo-4: Para Jetty (7 e acima)
Inclua o JAR jetty-servlets em seu WEB-INF/lib e mescle-o em seu 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 > |
Exemplo-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 > |
Exemplo-6: Em PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Por favor, deixe-me saber se você tiver mais perguntas sobre isso. A lista de todos os tutoriais Java pode ser encontrada aqui.