Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Vraptor4 + Cors

Olá a todos! Na empresa onde trabalho estamos desenvolvendo um portal e uma API para expor os dados para a sociedade, a ideia é que tornemos públicos os dados que na verdade já eram pra ser realmente públicos, mas que qualquer pessoa utilizando qualquer linguagem ou ferramenta envie uma requisição get para uma URL e obtenha um json como retorno.

Como qualquer domínio poderá fazer uma requisição para a minha API, eu implementei um filtro para solucionar o problema do CORS como indicado aqui: https://pedrohosilva.wordpress.com/2015/04/28/aplicacao-web-com-vraptor-4-pt9/

Mas ao tentar fazer um cliente javascript para a minha API, ainda está apresentando erro de CORS:

jquery2.1.4.min.js:4 GET http://www4.tce.ma.gov.br/tce_api/licitacoes&enteId=1 send @ jquery2.1.4.min.js:4ajax @ jquery2.1.4.min.js:4(anonymous function) @ licitacoes:17
licitacoes:1 XMLHttpRequest cannot load http://www4.tce.ma.gov.br/tce_api/licitacoes&enteId=1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 405.

O código está dessa forma:

@Controller
public class CORSController {

    private Result result;
    private Router router;
 public CORSController() { }

    @Inject
    public CORSController(Result result, Router router) {
        this.result = result;
        this.router = router;
    }

    @Options
    @Path(value = "/*")
    public void options(@Observes VRaptorRequestStarted requestInfo) {

        Set<HttpMethod> allowed = router.allowedMethodsFor(requestInfo.getRequest().getRequestedUri());
        String allowMethods = allowed.toString().replaceAll("\\[|\\]", "");

        result.use(Results.status()).header("Allow", allowMethods);
        result.use(Results.status()).header("Access-Control-Allow-Methods", allowMethods);
        result.use(Results.status()).header("Access-Control-Allow-Headers", "Content-Type, X-Requested-With, accept, Authorization, origin");
    }

}
@Intercepts
public class CORSInterceptor {

    private HttpServletRequest request;
    private HttpServletResponse response;

    public CORSInterceptor() {}

    @Inject
    public CORSInterceptor(    HttpServletRequest request,
                            HttpServletResponse response ) {
        this.request = request;
        this.response = response;
    }

    @BeforeCall
    public void intercept() throws InterceptionException {

        String origin = request.getHeader("origin") != null ? request.getHeader("origin") : "*";

        response.addHeader("Access-Control-Allow-Origin", origin);
        response.addHeader("Access-Control-Allow-Credentials", "true");
        response.addHeader("Access-Control-Expose-Headers", "Content-Type, Location");
    }

}

Mas não tá rolando não, alguém pode me dar uma força?

2 respostas
solução!

Oi Ricardo, os cabeçalhos parecem corretos.. vc já chegou a debugar para verificar se os códigos estão sendo executados? De qualquer maneira, acho que o melhor jeito para fazer isso, seria fazer um filtro :).

Oi Alberto! beleza, só vou poder testar na segunda, pesquisando um pouco por aqui encontrei essa biblioteca aqui http://software.dzhuvinov.com/cors-filter.html que é um filtro já pronto, uma autora famosa falou que usa ele bastante, então deve ser bom rsrsr