
Estava trabalhando em um projeto onde o web service em Jersey e a aplicação cliente em AngularJS estavam rodando no mesmo servidor Glassfish. Como esperado, quando a aplicação cliente consumisse o web service surgiria o erro “No ‘Access-Control-Allow-Origin’ header is present on the requested resource”. Isso é uma questão relacionada ao CORS ou Cross-origin resource sharing. Uma aplicação web pode carregar livremente imagens, stylesheets, scripts, iframes, videos e plugins como o Adobe Flash de qualquer domínio. Porém, web fonts e requisições em AJAX são limitadas apenas para dentro do próprio domínio, e no meu caso, o web service está em um domínio (http://localhost:8080/meuwebservice/) diferente do domínio da aplicação (http://localhost:8080/minhaaplicacao/), que possui o AngularJS fazendo requisições AJAX.
Para resolver tal situação, eu inseri o seguinte provider abaixo no meu web service. Lembrando que, para funcionar, os providers apenas devem estar na pasta que é lida pelo Jersey, ou pode ser entendida como a pasta onde estão os Resources, nenhuma outra configuração é necessária.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.IOException; | |
import javax.ws.rs.container.ContainerRequestContext; | |
import javax.ws.rs.container.ContainerResponseContext; | |
import javax.ws.rs.container.ContainerResponseFilter; | |
import javax.ws.rs.ext.Provider; | |
@Provider | |
public class RestResponseFilter implements ContainerResponseFilter{ | |
@Override | |
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException{ | |
responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", "*"); | |
responseContext.getHeaders().putSingle("Access-Control-Allow-Credentials", "true"); | |
responseContext.getHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); | |
responseContext.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept"); | |
} | |
} |