【问题标题】:Recieving cookie in angular from php response从 php 响应中以角度接收 cookie
【发布时间】:2017-12-07 04:37:06
【问题描述】:

一段时间以来,我一直在尝试从 php 中检索 cookie。

从php我有这个方法:

public function created()
{
  $datetime = date_create()->format('Y-m-d H:i:s');
  $json =file_get_contents('php://input');
  var_dump($json);
  $decoded = json_decode($json, true);
  $cookie="";
  $obj=new \stdClass();

  if($decoded['cookie']==""){
    $cookie=$random = rand(1,1000);
    setcookie( "cookie", "$cookie", time() + (10 * 365 * 24 * 60 * 60), "/", "http://localhost" );
  }
  else{
    $cookie=$decoded['cookie'];
  }

        $user=[
            'name'=>$decoded['name'],
            'surname'=>$decoded['surname'],
            'email'=>$decoded['email'],
            'review'=>$decoded['review'],
            'time'=>$datetime,
            'cookie'=>$cookie,
        ];
  $obj->cookie=$cookie;
  DatabaseModel::newuser($user);
  //return response()->json($cookie);
}

如果不存在 cookie,它会创建 cookie,我会在响应标头中看到它。 (暂时不要关注我是如何创建cookie的,我现在的rand()函数不是正确的方法,它只是为了测试)

在我有棱角的一面:

function PostReview(JSONObject) {
        if (JSONObject != null) {
            debugger;

            $http({

                url: 'http://localhost:8000/creation',
                method: "POST",
                data: JSONObject,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded;charset=utf-8;",
                    "Accept": "application/json"

                },

            })
                .then(function (data) {

                    console.log(data.headers('Set-cookie'));

                }, function (data) {
                    console.log(data.headers('Set-cookie'));
                });
        }

    }

我想发布我的 JSON 对象并接收带有响应的 cookie。但是我很困惑。我尝试使用 .success() 但它已被弃用,所以我使用 .then() ,但随后我打印 console.log(data.headers('Set-cookie')); 我得到空结果。有没有人遇到过类似的问题?

我也试过了:

.then(function (data, status, headers, config) {

                    console.log(headers('Set-cookie'));

                }, function (data, status, headers, config) {
                    console.log(headers('Set-cookie'));
                });

和:

.then(function(response) {
                    if (response.data == 'ok') {
                        $cookies['X-AUTH-TOKEN']=response.headers('X-AUTH-TOKEN');
                        // below put,put,putObject Cookies value is valid for Angular version >= 1.4
                       var $cookie= $cookies.putObject('X-AUTH-TOKEN',response.headers('X-AUTH-TOKEN'));
                        console.log($cookie);
                        debugger;

                    }

                });

但他们都没有工作。会是什么问题?


我的客户端:

function PostReview(JSONObject) {
        if (JSONObject != null) {
            debugger;

            $http({

                url: 'http://localhost:8000/creation',
                method: "POST",
                data: JSONObject,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded;charset=utf-8;",
                    "Accept": "application/json"
                }

            })
        }
    }

在我的控制器中:

$scope.Cookie = $cookies.get('cookie');
    $scope.$watch('Cookie', function() {
        $scope.Cookie = $cookies.get('cookie');
    });

跨域 cookie 怎么样?

【问题讨论】:

  • 要获取您定义的 cookie,只需在您的控制器中注入 $cookies,然后使用 $cookies.get("cookie");...您需要准确发布您的客户端的外观和位置重新使用$cookies.get("cookie");,这样会更容易帮助你
  • @ElmerDantas 我更新了我的答案,我尝试在各个地方添加$cookies.get("cookie");,但我想我应该看看它。但似乎没有任何效果
  • 你能不能在控制器上放一个console.log 来打印$cookies.get("cookie");发出请求然后刷新页面?可能你会看到它的价值。恐怕您无法以尝试的方式访问该值
  • 刚才我注意到您使用的不是同一个域,,,这是为什么呢?
  • 因为我的 php 服务器在 localhost:8000 中,而我的前端在 localhost/

标签: php angularjs cookies


【解决方案1】:

set-cookie 是对您的客户端应用程序(例如运行您的代码的浏览器)的指令,而不是针对您的代码的指令。 它应该会自动将 cookie 保存到您的客户端,然后它将在 wach 调用中自动发送到服务器。 要获取当前的 cookie,您可以使用 $cookies。

如果 cookie 没有保存,可能有很多原因,例如也许域名不匹配, 基本上,为了读取 cookie,set-cookie 的所有参数都应该与当前页面匹配,并且过期日期应该是将来的(或省略)。

好的,找到你的问题,你应该添加端口号,像这样:

setcookie( "cookie", "$cookie", time() + (10 * 365 * 24 * 60 * 60), "/", "http://localhost:8000" );

【讨论】:

  • 我越来越不确定。不确定是不是因为我没有从我的created() 函数返回任何来自 php 方面的内容,或者我错误地调用了$cookies.get("cookie");
  • 我认为它不应该是端口号,因为我的 api 是 localhost:8000 而我的客户端是 localhost/
  • 如果是这样,那么您的 api 无法将 cookie 植入客户端,因为它们被视为完全不同的域,对 localhost:8000/creation 的请求只能将 cookie 发送到 localhost:8000 托管页。如果您想在客户端获取 cookie,您应该将其移动到 localhost:8000 下,或者将您的 api 移动到 localhost
  • 真的不可能在 localhost:800 上有 api,在 localhost 上有前端并在那里检索 cookie 吗?
  • 这是规则,请参阅:en.wikipedia.org/wiki/HTTP_cookie#Domain_and_Path 为什么不将它们作为两个不同的虚拟路径放在同一个端口上?例如localhost/api/creation localhost/guestbookstorage/ang
【解决方案2】:

我找到了解决问题的方法,它可能不是解决问题的最佳方法,但如果有人遇到同样的问题,它可能会有所帮助。

function PostReview(JSONObject) {
        if (JSONObject != null) {
            $http({

                url: 'http://localhost:8000/creation',
                method: "POST",
                data: JSONObject,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded;charset=utf-8;",
                    "Accept": "application/json",
                    "crossDomain": true,
                    "withCredentials": true 
                }

            }).then(function (response) {
            if(response.data.cookie_value===undefined){
                var info = JSON.parse(JSONObject);
                console.log(info.cookie);
                $cookies.put('userCookie', info.cookie);

            }
            else{
                console.log(response.data.cookie_value);
                $cookies.put('userCookie', response.data.cookie_value);
            }
            $rootScope.savedInfo=JSON.parse(JSONObject);
        });
        }
    }

如果不存在,我从响应方法中设置cookie,如果存在,则使用我的json对象中的值。

在 php 端,我检查我发送的 cookie 是否为空,如果是,则创建 cookie。看起来并不难,但我花了很多时间在这上面。

public function created()
{
    $date = new DateTime();
    $date->setTimeZone(new DateTimeZone("Europe/Vilnius"));
    $get_datetime = $date->format('d.m.Y H:i:s');

  $datetime = date_create()->format('Y-m-d H:i:s');
  $json =file_get_contents('php://input');
  $decoded = json_decode($json, true);
  $cookie="";
  $obj=new \stdClass();

  if($decoded['cookie']==" "){
    $cookie_name = "user";
    $cookie_value =$random = md5(rand(1,1000));
    setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
    $_COOKIE[$cookie_name]=$cookie_value;
    $obj->cookie_value=$cookie_value;
  }
  else{
   $cookie_value=$decoded['cookie'];
  }

        $user=[
            'name'=>$decoded['name'],
            'surname'=>$decoded['surname'],
            'email'=>$decoded['email'],
            'review'=>$decoded['review'],
            'time'=>$datetime,
            'cookie'=>$cookie_value,
        ];
//  $obj->cookie=$cookie;
  DatabaseModel::newuser($user);

     return response()->json( $obj);
}

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2020-10-28
    • 2018-07-24
    • 2013-03-04
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2020-10-26
    • 2016-11-08
    相关资源
    最近更新 更多