两次跨域

时间:2018-06-02 12:19:11

标签: php html cross-domain cas

我想从网站前端的跨域访问数据。 我有三个网站:a.com,b.com和c.com。网站a.com是前端。网站b.com是后端(API)。 c.com是CAS服务器。

我可以直接访问浏览器上的http://b.com/example_test.php。它成功跳转到CAS页面进行登录。然后在登录后,API返回数据。

我想让a.com获取b.com的数据。我的代码是:

我的前端HTML:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="Access-Control-Allow-Origin" content="*">
        <title>Title</title>
    </head>
    <body>
    <h3 id="article_title"></h3>
    <p id="article_text"></p>
    </body>

    <script type="application/javascript">
      var xmlHttpReq = null;
      if (window.ActiveXObject) {
        xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
      } else if (window.XMLHttpRequest) {
        xmlHttpReq = new XMLHttpRequest();
      }

      if (xmlHttpReq !== null) {
        xmlHttpReq.open("get", "http://b.com/example_test.php");
        xmlHttpReq.timeout = 10000;
        xmlHttpReq.send("");
        xmlHttpReq.onreadystatechange = doResult;
      }

      function doResult() {    
        if (xmlHttpReq.readyState === 4) {
          console.log(xmlHttpReq.status);
          if (xmlHttpReq.status === 200) {
            var data = xmlHttpReq.responseText;
            var json_data = JSON.parse(data);
            /**
             do somethin.
             */
          }
        }
      }
    </script>
    </html>

我的后端api example_test.php:

    <?php
    header('Access-Control-Allow-Origin:*');
    header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS');
    header('Access-Control-Allow-Headers:Origin,Content-Type,Authorization,X-auth-Token');
    require_once './MyCAS.php';

    $resp = array(
        'stats' => -1,
        'msg' => 'Empty!'
    );
    if (array_key_exists('username', $_COOKIE)) {
        /**
         do something
         **/
    } else {
        phpCAS::client(CAS_VERSION_2_0, "mycase.server.com", 443, "/cas", false);
        phpCAS::setNoCasServerValidation();
        phpCAS::forceAuthentication();
        if (phpCAS::isAuthenticated()) {
            $username = phpCAS::getUser();
            if ($username !== null) {
                $token = md5($username.date('s', time()).date('i', time()));
                setcookie('username', $username, time() + 1*86400, '/');
                setcookie('token', $token, time() + 1*86400, '/');

                /**
                 do something
                 **/
            }
        }
    }
    ?>

但是当我在浏览器上访问a.com时,我没有跳转到CAS页面。我不明白这个问题。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您无法通过ajax重定向来电者的请求。使用JavaScript实现它的一种方法。

PHP示例:

<?php
echo 'redirect';

关于HTML JavaScript:

$.ajax({
            type: 'POST',
            async: false,
            url: '/users',
            contentType: 'application/json',
            dataType: 'json',
            data: JSON.stringify(payload),
            success: function(data, textStatus, jqXHR){
                if(data == 'redirect'){
                    console.log(jqXHR.status);
                    window.location.href= "/thankyou.html";
                }
            }
        });