从php回复角度接收cookie

时间:2017-07-03 20:33:15

标签: php angularjs cookies

我一直试图从php中检索cookie一段时间。 post

来自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,我现在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'));我得到了null结果。有没有人有类似的问题?

我也尝试过:

.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的问题?

2 个答案:

答案 0 :(得分:0)

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

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

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

      String url = "http://www.air-intra.com/apps/air-app/agregar.php?token=" + Token_Recibido + "&codiart=" + codigo + "&oper=Q&renglon=" + reglo + "";
            HttpHandler she = new HttpHandler();
            JSONObject jsonStr = she.makeServiceCall(url);


            try {
                JSONObject    jsonObj = new JSONObject((Map) jsonStr);
                JSONArray contacts = jsonObj.getJSONArray("PRR");
                for (int i = 0; i < contacts.length(); i++) {
                    JSONObject c = contacts.getJSONObject(i);

                    String codig = c.getString("codigo");
                    String des = c.getString("descrip");
                    String prec = c.getString("precio");
                    String reglon = c.getString("renglon");

                    Log.d("REGLON", String.valueOf(reglon));

                    HashMap<String, String> contacto = new HashMap<>();
                    contacto.put("codigo", codig);
                    contacto.put("descrip", des);
                    contacto.put("precio", prec);
                    contacto.put("renglon", reglon);
                    reg = "" + reglon;
                    prod.add(contacto);

答案 1 :(得分:0)

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

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