javascript - Symfony2 : allow Access-Control-Allow-Origin with google charts

标签 javascript html symfony xmlhttprequest same-origin-policy

在我的 Symfony 应用程序中,我使用的是谷歌图表。

我收到一个错误:

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.

我试图通过设置一个向响应添加 header 的监听器来解决这个问题(请参阅此处的 cors 监听器: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);
}
}

在我看来,我使用了一个简单的谷歌图表:

<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>

最佳答案

尝试只在响应中设置 header ,它奏效了:

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

请注意,URL 必须与预期的完全一致,带有 HTTP 或 HTTPS,末尾没有/。

可以设置多个 header ,在我的例子中我使用了 4 个,HTTP 和 HTTPS,开发和生产服务器。一切正常。

关于javascript - Symfony2 : allow Access-Control-Allow-Origin with google charts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29975384/

相关文章:

symfony - 尝试使用 targetPath 登录 Symfony 后重定向用户,但它始终为 null

javascript - 通过python在网络浏览器上显示arduino串口数据

javascript - 复选框启用只读输入不工作

php - 如何获取 symfony 2.3 中的当前语言环境?

javascript - 如何验证 PHP Codeigniter 中下拉菜单中的选项?

jquery - 图像与暂停重叠 - skrollr

symfony - Symfony2 路由中的两个可选变量

javascript - 使用鼠标移动背景图像 – CSS 和 JS – 多个水平堆叠的 DIV

javascript - 检查多点图层是否包含在 Openlayers 中的多边形中

javascript - 覆盖所有类的 css 选择器(*选择器)