【问题标题】:Getting Cross-Origin Request Blocked: when using jqgrid阻止跨域请求:使用 jqgrid 时
【发布时间】:2015-02-21 22:59:27
【问题描述】:

我第一次尝试使用 jqgrid 设置页面。我正在使用我发现的一个简单示例: index.php

<?php
 header("Access-Control-Allow-Origin: *");
?>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>My First Grid</title>

<link rel="stylesheet" type="text/css" media="screen" href="css/jquery-ui.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />

<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<script src="js/grid.locale-en.js" type="text/javascript"></script>
<script src="js/jquery.jqGrid.min.js" type="text/javascript"></script>

<script type="text/javascript">

$(function () {
   $(document).ready(function(){
    $("#list").jqGrid({
        url: 'http://localhost/jqgrid/example.php',
        datatype: "json",
        mtype: "GET",
        colNames: ["First Name", "Last Name", "Equipment Borrowed", "Service Tag", "Reason Borrowed", "Date Taken", "Expected Return Date", "Comments", "ID"],
        colModel: [
            { name: "FName",sortable: false },
            { name: "LName"},
            { name: "Eqpmnt_Brwd", align: "center"},
            { name: "Service_Tag", align: "right",sortable: false },
            { name: "Brwd_Rsn", align: "right", sortable: false },
            { name: "Date_Taken"},
            { name: "Exp_Return"},
            { name: "Comments", sortable: false },
            { name: "id"}
        ],
        pager: "#pager",
        rowNum: 5,
        autowidth: true,
        rownumbers: false,
        rowList: [5, 10, 15],
        sortname: "invid",
        sortorder: "desc",
        viewrecords: true, 
        gridview: true,
        autoencode: true,
        height: 'auto',
        width: '500',
        loadonce: true,
        caption: "Alan's Grid"
    }); 
 }); 
});
</script>

</head>
<body>
    <table id="list"><tr><td></td></tr></table> 
    <div id="pager"></div> 
</body>
</html>

example.php:

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);

//database setting
$dbhost='localhost';
$dbuser='***';
$dbpassword='***';
$database='inventory_form';
$page = $_GET['page'];
// get the requested page
$limit = $_GET['rows'];
// get how many rows we want to have into the grid
$sidx = $_GET['sidx'];
// get index row - i.e. user click to sort
$sord = $_GET['sord']; // get the direction if(!$sidx)
$sidx =1;
// connect to the database
$db = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error());
mysql_select_db($database) or die("Error conecting to db.");
$result = mysql_query("SELECT COUNT(*) AS count FROM Inventory");
$row = mysql_fetch_array($result,MYSQL_ASSOC);
$count = $row['count'];
if( $count > 0 ) {
$total_pages = ceil($count/$limit);
}
else {
$total_pages = 0;
}
if ($page > $total_pages) $page=$total_pages;
$start = $limit*$page - $limit; // do not put $limit*($page - 1)
$SQL = "SELECT * FROM Inventory ORDER BY $sidx $sord LIMIT $start , $limit";
$result = mysql_query( $SQL ) or die("Couldn t execute query.".mysql_error());
$responce->page = $page;
$responce->total = $total_pages;
$responce->records = $count;
$i=0;
while($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
$responce->rows[$i]['id']=$row[id];
$responce->rows[$i]['cell']=array($row[FName],$row[LName],$row[Eqpmnt_Brwd],$row[Service_Tag],$row[Brwd_Rsn],$row[Date_Taken],$row[Exp_Return],$row[Comments],$row[id]);

$i++;
}
echo json_encode($responce);
?> 

我在 index.php 页面上只看到列标题,查看 java 控制台我只注意到一个警告

"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/jqgrid/example.php?_search=false&nd=1424558292246&rows=5&page=1&sidx=invid&sord=desc. This can be fixed by moving the resource to the same domain or enabling CORS.
http://localhost/jqgrid/example.php?_search=false&nd=1424558292246&rows=5&page=1&sidx=invid&sord=desc
Line 0

阅读 CORS 我将我的 Apache 开发服务器设置为 a2enmod 标头,但仍然收到错误消息。而且我还尝试了 php 命令头(等...)但也没有好处。如果可能的话,我更喜欢客户端解决方案。我也知道我应该使用 PDO,但我找不到一个例子。甚至 jqgrid 站点示例也不使用 PDO。有关解决此问题的任何建议。

【问题讨论】:

    标签: php


    【解决方案1】:

    原点的定义 如果两个页面的协议、端口(如果指定)和主机相同,则两个页面具有相同的来源。

    http://store.company.com/dir2/other.html成功
    http://store.company.com/dir/inner/another.html成功
    https://store.company.com/secure.html失败不同协议 http://store.company.com:81/dir/etc.html 失败的不同端口 http://news.company.com/dir/other.html 失败 不同主机

    您可以使用更改域

    document.domain = "yourdomain.com";
    

    比启用跨域访问更简单、更安全

    【讨论】:

    • 谢谢,我改成了 url: '192.168.1.20/jqgrid/example.php',没有更多警告了。但是,除了我的索引页面上的列标题之外,我仍然没有得到任何东西。你有什么建议吗?
    • 您能说明您对此请求的响应是什么
    • 我在 example.php 页面上收到此错误:无法执行查询。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法
    • 显然MySql这行有问题 $SQL = "SELECT * FROM Inventory ORDER BY $sidx $sord LIMIT $start , $limit";不过我没看到。
    • 尝试通过放置常量而不是变量来运行此查询,如果它运行,您将需要正确格式化此行。使用点运算符连接变量。
    【解决方案2】:

    您需要将header("Access-Control-Allow-Origin: https://datasource.com"); 放入服务器而不是客户端。 例子 https://origin.com/ 是您拥有 jqgrid 的地方 https://datasource.com 是您要获取数据的位置。 数据源中的 php 文件将以

    开头
    <?php    
    header("Access-Control-Allow-Origin: https://origin.com");
    header('Access-Control-Allow-Credentials: true');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-09
      • 2021-06-26
      • 2014-10-13
      • 1970-01-01
      • 2019-11-04
      • 2017-02-06
      相关资源
      最近更新 更多