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

Comunicação entre portas diferentes

Estou fazendo uma requisição através do AngularJS na porta 3000:

function _registrarNovaAposta(aposta) {
            return $http.post("http://localhost:8080/sga-api/apostas/nova-aposta", aposta);
}

para o endpoint:

    @POST
    @Path("/nova-aposta")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public String registrarNovaAposta(Aposta aposta) {
        apostaService.registrar(aposta);
        return "ok";
    }

mas recebo o seguinte erro no console: "Access to XMLHttpRequest at 'http://localhost:8080/sga-api/apostas/nova-aposta' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource."

o problema é que o GET retorna os dados normalmente, mas com o POST da esse problema de CORS, já tentei configurar os "headers" no angular mas não funcionou

3 respostas

meu web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>br.com.sga.api</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Fala Leandro, tudo bem?

Resumindo, esse erro ocorre por uma questão de segurança implementada nos browsers, que impede requisições AJAX para outros domínios (no seu caso, embora seja localhost, por ser uma porta diferente já é tratada como se fosse outro domínio).

Veja nesses links se ajuda você:

https://stackoverflow.com/questions/20035101/why-does-my-javascript-code-get-a-no-access-control-allow-origin-header-is-pr

https://www.html5rocks.com/en/tutorials/cors/

https://medium.com/@gigioSouza/resolvendo-o-problema-do-cors-com-angular-2-e-o-angular-cli-7f7cb7aab3c2

Abraços!

solução!

Obrigado pelo ajuda Renato, vou dar uma olhada nos links pra ver se encontro informação extra, mas já resolvi o problema com a classe CORSFilter e com uma alteração no web.xml:

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 CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext request,
            ContainerResponseContext response) throws IOException {
        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        response.getHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}
        <init-param>
          <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
          <param-value>br.com.sga.api.config.CORSFilter</param-value>
        </init-param>