the resource requested present origin nelmio control allow javascript html symfony xmlhttprequest same-origin-policy

javascript - resource - symfony 4 cors



Symfony2: permitir Access-Control-Allow-Origin con google charts (3)

Prueba esto::

use Symfony/Component/HttpFoundation/Response; $xmlContent = ''Your XML content''; $response = new Response(); $response->setContent($xmlContent); $response->headers->set(''Content-Type'', ''text/xml''); $response->headers->set(''Access-Control-Allow-Origin'', ''http://foodmeup.dev''); // prints the headers followed by the content $response->send();

No probado

Editar:

Es posible que deba establecer la respuesta al evento:

$response = $event->getResponse(); $response->headers->set(''Access-Control-Allow-Headers'', ''origin, content-type, accept''); ... $event->setResponse($response);

En mi aplicación Symfony, estoy usando Google charts.

Me sale un error:

XMLHttpRequest cannot load https://www.google.com/uds/api/visualization/1.0/dca88b1ff7033fac80178eb526cb263e/ui+en.css. No ''Access-Control-Allow-Origin'' header is present on the requested resource. Origin ''http://foodmeup.dev'' is therefore not allowed access.

He intentado evitar esto configurando un oyente que agrega encabezados a la respuesta (vea el oyente de cors aquí: Symfony2 - ¿cómo puedo configurar Encabezados personalizados? ) Y no está funcionando, obtengo el mismo error.

<?php namespace AppBundle/EventListener; use Symfony/Component/HttpKernel/Event/FilterResponseEvent; class CorsListener { public function onKernelResponse(FilterResponseEvent $event) { $response = $event->getResponse(); $responseHeaders = $response->headers; $responseHeaders->set(''Access-Control-Allow-Headers'', ''origin, content-type, accept''); $responseHeaders->set(''Access-Control-Allow-Origin'', ''*''); $responseHeaders->set(''Access-Control-Allow-Methods'', ''POST, GET, PUT, DELETE, PATCH, OPTIONS''); $event->setResponse($response); } }

En mi opinión, uso un simple gráfico de Google:

<div class="piechart margin-auto" style="height: 220px;" data-completeness="{{ completeness }}"></div> <script>var googleCharts = [];</script> <script type="text/javascript"> function drawProfilePieCharts() { var completeness = $(this).data(''completeness''); var data = google.visualization.arrayToDataTable([ [''Nom'', ''Valeur''], ["Profil rempli à ", completeness], [''Manque'', 100 - completeness] ]); var options = { backgroundColor: { fill:''transparent''}, pieSliceBorderColor : ''transparent'', pieHole: 0.8, legend: {position: ''top''}, width: 220, height: 220, tooltip: {trigger: ''none''}, pieStartAngle: -90, pieSliceTextStyle :{fontsize : 16, color: ''transparent''}, slices: { 0: { color: ''#09b4ff''}, 1: { color: ''#444''} }, chartArea : {width: ''90%'', height: ''90%''} }; var chart = new google.visualization.PieChart(this); chart.draw(data, options); } googleCharts.push("$(''.piechart'').each(drawProfilePieCharts)"); $(window).resize(function(){ drawAllCharts(); }); google.load(''visualization'', ''1'', {packages:[''corechart'', ''bar'', ''line'']}); var drawAllCharts = function() { for (var i = 0; i < googleCharts.length; i++) { eval(googleCharts[i]); } }; google.setOnLoadCallback(function(){drawAllCharts()}); </script>


Intenté simplemente configurar el encabezado en la respuesta, y funcionó:

$response->headers->set(''Access-Control-Allow-Origin'', ''http://foodmeup.dev'');

Tenga en cuenta que la URL DEBE SER exactamente la esperada, con HTTP o HTTPS y no / al final.

Es posible configurar más de uno de estos encabezados, en mi caso utilicé 4, HTTP y HTTPS, servidores de desarrollo y prod. Todo funcionó bien.


Una buena cosa aquí es usar el suscriptor de eventos kernel, como por ejemplo:

class Toto implements EventSubscriberInterface { public static function getSubscribedEvents() { return array( KernelEvents::RESPONSE => ''onKernelResponse'' ); } public function onKernelResponse(FilterResponseEvent $event) { $httpRequestOrigin = $event->getRequest()->headers->get(''origin''); $event->getResponse()->headers->set(''Access-Control-Allow-Origin'', $httpRequestOrigin); $event->getResponse()->headers->set(''Access-Control-Allow-Credentials'', ''true''); } }