O que é Cross-Origin Resource Sharing (CORS) – Como adicioná-lo ao seu Java Jersey Web Server?

Publicados: 2014-07-19

Tutorial Cross-Origin Resource Sharing (CORS) por Crunchify

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.

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:

  1. Noções básicas sobre o compartilhamento de recursos entre origens (filtros CORS)
  2. Posso usar o Compartilhamento de Recursos de Origem Cruzada
  3. Como habilitar o compartilhamento de recursos entre origens
  4. O que é Ajax entre domínios com compartilhamento de recursos entre origens
  5. 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.

Exemplo de servidor Crunchify CORSFilter Jersey

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:

  1. Acesso-Controle-Permitir-Origem
  2. Métodos de controle de acesso-permissão
  3. Acesso-Controle-Max-Idade
  4. Cabeçalhos-Controle-Acesso-Permitir-

Código do filtro CORS:

Modificação em JerseyEmbeddedHTTPServerCrunchify.java do tutorial anterior.

Basta adicionar a linha abaixo em createHttpServer() e reiniciar o servidor.

Resultado:

http://localhost:8085/api

Cabeçalho de resposta Crunchify com filtro CORS

Aqui estão os detalhes dos cabeçalhos.

Cabeçalho de resposta do Crunchify sem filtro CORS

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 .

Exemplo-3: O servidor .NET pode configurar isso em web.config como abaixo

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

Exemplo-5: Servidor Apache Tomcat (v 7.0.41 +)

Exemplo-6: Em PHP

Por favor, deixe-me saber se você tiver mais perguntas sobre isso. A lista de todos os tutoriais Java pode ser encontrada aqui.