¿Cómo evitar el error CORS en Vuejs corriendo en un contenedor de muelles?

Tengo un Vue Frontend dentro de un contenedor docker que se conecta a un backend de Spring-boot en otro contenedor. El backend obtiene sus datos de un MongoDB (también en un contenedor). Cuando construyo mi frontend Vue en un contenedor docker, e intento obtener datos de la base de datos, obtengo un error CORS.

Access to XMLHttpRequest at 'http://localhost:8010/persons' from origin 'http://localhost:8080' has been blocked by CORS policy: La respuesta a la solicitud previa al vuelo no pasa el control de acceso: Ningún encabezado 'Access-Control-Allow-Origin' está presente en el recurso solicitado.

Mi backend se ejecuta en un contenedor docker con puerto 8010 publicado y mi Vue frontend en un contenedor con puerto 8080. Permitir-cross-origin ya está establecido en mi backend.

este es el archivo de taquilla en mi frontend:

FROM node:lts-alpine
RUN npm install -g http-server
WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . /app

RUN npm run build

EXPOSE 8080

CMD ["http-server", "dist"]

y construir la imagen con:

docker build -t frontend .

y

docker run -d -it -p 8080:8080 --name frontend frontend

Así que en Vue puse axios para:

axios.defaults.baseURL = "http://localhost:8010/";

axios.defaults.headers.get["Content-Type"] = "application/json";
axios.defaults.headers.post["Content-Type"] = "application/json";
axios.defaults.headers.get["Access-Control-Allow-Origin"] = "*";

y hacer esta solicitud:

axios.get("/persons").then(res => {
        if (res.data.length === 0) {
          console.log("No Persons found!", res.data);
        }
        console.info("ready", res.data);
        for (let i in res.data) {
          this.persons.push(res.data[i]);
        }
      });

En mi backend de Spring-boot ya permito acceso cross-origin.

Y en modo de desarrollo todo funciona, porque puedo proxy la solicitud dentro del archivo vue.config.js con

devServer: {
  proxy: "http://localhost:8010"
  } 

y yo mi navegador también puedo conectar a mi backend y cambiar. Sólo la aplicación vue no encuentra el backend. ¿Cuál es el problema? ¿Cómo puedo evitar el error de cors y llegar a mi backend?

Lo siento por mi mal inglés

Pregunta hecha hace 3 años, 4 meses, 26 días - Por webweaverx


2 Respuestas:

  • El error CORS que estás experimentando se debe a que el navegador impide las solicitudes entre dominios diferentes por motivos de seguridad. Para solucionar este problema, puedes seguir los siguientes pasos:

    • En tu backend de Spring-boot, asegúrate de que la configuración de CORS esté correctamente habilitada. Puedes agregar la siguiente anotación a tu clase de configuración de Spring `@CrossOrigin(origins = "http://localhost:8080")`, especificando el origen desde el que se permitirán las solicitudes.
    • En tu frontend de Vue, evita configurar manualmente los encabezados de CORS en axios. En lugar de eso, utiliza el proxy en el archivo `vue.config.js` para redirigir las solicitudes al backend. De esta forma, no será necesario especificar manualmente los encabezados CORS. Puedes configurar el proxy de esta manera:
    javascript
    devServer: {
      proxy: {
        '/persons': {
          target: 'http://localhost:8010',
          changeOrigin: true
        }
      }
    }
    
    • Asegúrate de que tu frontend Vue sea capaz de comunicarse con el backend a través del proxy configurado en el paso anterior.

    Después de realizar estos cambios, reconstruye tu imagen de Docker para el frontend y vuelve a ejecutar el contenedor. Con estas configuraciones, deberías poder evitar el error CORS y conectarte correctamente con tu backend desde el frontend Vue dentro de un contenedor de Docker.

    Respondida el Dec 20, 2020 a las 21:14 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    Cuando ejecutas tu aplicación Vue.js dentro de un contenedor Docker, obtienes un error CORS al intentar acceder a datos desde tu backend de Spring Boot.

    Solución:

    Para resolver el error CORS, debes configurar el encabezado Access-Control-Allow-Origin en tu backend de Spring Boot para permitir que el contenedor Vue.js acceda a sus recursos.

    Pasos para resolver el problema:

    • Configura el encabezado `Access-Control-Allow-Origin` en Spring Boot:

    Agrega lo siguiente a tu configuración de Spring Boot:

    java
       @Override
       protected void configure(HttpSecurity http) throws Exception {
           http.cors().and().csrf().disable();
       }
       

    Esto deshabilitará CSRF y configurará CORS para que permita todas las solicitudes de origen.

    • Verifica la configuración de CORS en Vue.js:

    Asegúrate de que la configuración de CORS en tu archivo vue.config.js sea correcta. Debe configurarse de la siguiente manera:

    javascript
       devServer: {
         proxy: "http://localhost:8010",
       }
       

    • Reconstruye y reinicia los contenedores:

    Después de realizar los cambios, reconstruye los contenedores Docker para tu backend de Spring Boot y tu frontend Vue.js. Luego, reinicia los contenedores para que los cambios surtan efecto.

    Explicación:

    El error CORS ocurre porque el navegador restringe el acceso a solicitudes entre orígenes diferentes por razones de seguridad. Al configurar el encabezado Access-Control-Allow-Origin en tu backend, permites que el navegador de tu frontend Vue.js acceda a los recursos de tu backend.

    Nota:

    Si aún experimentas problemas de CORS, asegúrate de que no haya otros factores que puedan estar causando el problema, como la configuración del firewall o la configuración del proxy.

    Respondida el Dec 20, 2020 a las 21:20 - por Gemini

    Votos positivos: 0 | Votos negativos: 0