从php响应以角度接收cookie

从php响应以角度接收cookie,php,angularjs,cookies,Php,Angularjs,Cookies,我尝试从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 \

我尝试从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的,I now 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()
,但随后我打印
控制台.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'));
                });
以及:

但没有一个成功。可能是什么问题


我的客户方:

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

如果cookie未保存,可能有多种原因,例如,域名可能不匹配, 基本上,为了读取cookie,设置的cookie的所有参数都应该与当前页面匹配,并且到期日期应该在将来(或省略)

好的,找到您的问题,您应该添加端口号,如下所示:

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

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

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

我越来越不确定了。不确定这是否是因为我没有从我的
created()
函数返回php端的任何内容,或者我调用了
$cookies.get(“cookie”)不正确我不认为应该是端口号,因为我的api是localhost:8000,我的客户端是localhost/如果是这样,那么你的api就不能将cookie植入客户端,因为它们被视为完全不同的域,请求只能将cookie发送到localhost:8000托管页面。如果您想在客户端获取cookie,您应该将其移动到localhost:8000下,或者将您的api移动到localhost:800上,并将前端移动到localhost上,然后在那里检索cookie,这是规则,请参见:为什么不将它们作为两个不同的虚拟路径放在同一端口上?e、 g.localhost/api/creation localhost/guestbookstorage/Ang要获取您定义的cookie,只需在控制器中注入
$cookies
,然后使用
$cookies.get(“cookie”)
…您需要准确地发布客户端的外观以及使用
$cookies.get(“cookie”)这样会更容易提供帮助you@ElmerDantas我更新了答案,尝试添加
$cookies.get(“cookie”)在不同的地方,虽然我想我应该看它。但是似乎什么都不起作用。您是否可以在控制器上放置一个
console.log
,以打印
$cookies.get(“cookie”)发出请求,然后刷新页面?也许你会看到它的价值。我担心您无法以您刚才尝试的方式访问该值,因为我注意到您使用的不是同一个域,,,为什么?因为我的php服务器位于localhost:8000中,而我的前端位于localhost上/
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);
}