Control de acceso Permitir origen en Angular 2

Tengo un problema para obtener datos de mi servidor node.js.

El lado del cliente es:

public getTestLines() : Observable { let headers = new Headers({ 'Access-Control-Allow-Origin': '*' }); let options = new RequestOptions({ headers: headers }); return this.http.get('http://localhost:3003/get_testlines', options) .map((res:Response) => res.json()) .catch((error:any) => Observable.throw(error.json().error || 'Server error')); } 

en el lado del servidor también establecí los encabezados:

 resp.setHeader('Access-Control-Allow-Origin','*') resp.send(JSON.stringify(results)) 

Pero me sale un error

“XMLHttpRequest no puede cargar http: // localhost: 3003 / get_testlines . La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: No hay encabezado ‘Access-Control-Allow-Origin’ en el recurso solicitado. Origen ‘ http: // localhost: 3000 ‘no está, por lo tanto, permitido el acceso “.

¿Cómo puedo arreglarlo? Cuando elimino los encabezados, dice que se requiere este encabezado.

Access-Control-Allow-Origin es un encabezado de respuesta , no un encabezado de solicitud.

Debe hacer que aparezca en la respuesta, no en la solicitud.

Has intentado ponerlo en la respuesta:

 resp.setHeader('Access-Control-Allow-Origin','*') 

… pero no funcionó.

Esto es probablemente porque no lo ha puesto en la respuesta a la solicitud correcta. El mensaje de error dice:

La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso

Has hecho algo para hacer que la solicitud sea preflighted. Esto significa que antes de que el navegador realice la solicitud GET que está tratando de realizar, realiza una solicitud de OPCIONES.

Esto es, presumiblemente, manejado por una porción diferente de código en su servidor, por lo que la línea resp.setHeader('Access-Control-Allow-Origin','*') no se está activando.

Una cosa que hace que se realice una solicitud preflighted es la adición de encabezados de solicitud (que no sean un pequeño número de excepciones). Agregar Access-Control-Allow-Origin a la solicitud activará una solicitud con verificación previa, por lo que lo primero que debe hacer para tratar de solucionar el problema es eliminar Access-Control-Allow-Origin de la solicitud .

Si eso falla, entonces necesita configurar su servidor para que pueda responder a la solicitud de OPCIONES, así como a la solicitud GET.

Access-Control-Allow-Origin es un encabezado de respuesta , no un encabezado de solicitud que necesita para corregir el permiso en su back-end. por lo tanto, debe crear el archivo cors.js que contenga todos los permisos necesarios.

 function crosPermission(){ this.permission=function(req,res,next){ res.header('Access-Control-Allow-Origin','*'); res.header('Access-Control-Allow-Headers','Content-Type'); res.header('Access-Control-Allow-Methods','GET','POST','PUT','DELETE','OPTIONS'); next(); } } module.exports= new crosPermission(); 

siguiente paso Necesitas agregar alguna línea en tu app.js

  var cors=require('./cors'); app.use(cors.permission) 

No configure Access-Control-Allow-Origin en la solicitud, nunca se necesita allí. Debe verificar si el encabezado está presente en la respuesta (verifíquelo en la consola del desarrollador). Sería útil si compartió más del código de back-end.

Si esto va a ser rest API => http: // localhost: 3003 / get_testlines

luego use @CrossOrigin (orígenes = “*”) para resolver el problema del dominio cruzado

Puede establecer en el encabezado php como,

 header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8");