3

В моем приложении Symfony я использую диаграммы Google.Symfony2: разрешить Access-Control-Allow-Origin с диаграммами Google

Я получаю сообщение об ошибке:

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. 

Я пытался обойти эту проблему, установив слушатель, который добавляет заголовки ответа (см Корса слушателя здесь: Symfony2 - how can I set custom Headers?), и это не работает, я получаю та же ошибка.

<?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); 
} 
} 

На мой взгляд, я использую простую схему: 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> 
+0

Можете ли вы показать код бэкэнда? – Manolo

+0

Если вы имеете в виду код для добавления заголовков в ответ, я скопировал слушателя cors отсюда: http://stackoverflow.com/questions/8472333/symfony2-how-can-i-set-custom-headers –

+0

You не устанавливают заголовки в ответ $. Вы устанавливаете их в $ responseHeaders –

ответ

2

Попробуйте ::

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(); 

Не тестировался

Edit:

Вы, возможно, придется установить ответ событие:

$response = $event->getResponse(); 

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

$event->setResponse($response); 
+0

ну, мне нужно сохранить его в моем слушателе, потому что я не буду изменять каждый ответ, или мне нужно более общее решение. установка указателя, который вы указали, не работает. настройка типа содержимого, так как text/xml противоречит метатегам, которые у меня есть. –

+0

Я видел ваш отредактированный вопрос. Проверьте мой новый ответ. – Manolo

+0

спасибо, что попробовали. Я обновил ответное событие, он тоже не работает. Могу ли я на самом деле что-то сделать? Разве это не заголовки ответа от google, в котором отсутствует этот параметр разрешающего доступа? –

5

Пробовал просто установить заголовок на ответ, и она работала:

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

Примите во внимание, что URL должен быть точно тот, который ожидается, с HTTP или HTTPS и no/в конце.

Возможно установить более одного из этих заголовков, в моем случае я использовал 4, HTTP и HTTPS, dev и prod-серверы. Все работало нормально.

+0

Вы можете использовать '*', чтобы разрешить все URL-адреса. –

2

Хорошая вещь здесь является использование ядра событий абонента, например:

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'); 
    } 
} 
+0

Спасибо! Ваш ответ мне очень помог) –

Смежные вопросы