【问题标题】:sessions in AngularjsAngularjs 中的会话
【发布时间】:2014-09-05 08:35:29
【问题描述】:

我正在使用 angularjs 和 PHP 构建登录。我遇到的问题是会话似乎没有设置。

当我点击登录按钮时,我有一个使用服务的控制器:

控制器:

$scope.doLogin = function() {
loginService.login({username: $scope.username, password: $scope.password});

};

这是我的服务:

'use strict';
angular.module('gameApp_services').factory('sessionService', ['$http', function($http) {
    return {
        set:function(key, value) {
            return sessionStorage.setItem(key,value);
        },
        get:function(key) {
            return sessionStorage.getItem(key);
        },
        destroy:function(key) {
            $http.post('lib/destroy_session.php'); //Förstör sessionen
            return sessionStorage.removeItem(key);
        }
    };
}]).factory('loginService', function($http,$location,sessionService) {
    return {
        login: function(data, scope) {
            var $promise = $http.post("lib/action.php", data); //send data to action.php
            $promise.then(function(msg) {
                var uid = msg.data;
                console.log(uid);
                if(uid) {
                    //scope.msgtxt='Correct information';
                    sessionService.set('sess_id', uid);
                    $location.path('/game');
                } else {
                    scope.msgtxt='Incorrect information';
                    $location.path('/firstpage');
                }
            });
        },
        logout:function() {
            sessionService.destroy('sess_id');
            $location.path('/firstpage');
        },
        islogged:function() {

            var $checkSessionServer = $http.post('lib/check_session.php');
            return $checkSessionServer;

            /*if(sessionService.get('user')) {
                return true;
            }*/
        }
    }
});

如您所见,我正在调用我的后端,在那里我检查用户名和密码,并设置会话。返回的 uid,包含 sessionID=1:

public function DoLogin($username, $password)
    {
        //Kolla så att användarnamn och lösenord är korrekt, returnera true eller false
        $get_user = "SELECT id, username,password FROM users WHERE username='".$username."' AND password='".$password."'";
        $user_result = mysql_query($get_user)
                        or die(mysql_error());


        if(mysql_num_rows($user_result) == 1)
        {
            $_SESSION['sess_id'] = mysql_result($user_result, 0);
            $_SESSION['sess_user'] = $username;
            return $_SESSION['sess_id'];
        }
        else
        {
            return false;
        }

    }

这行得通,正确的数据按预期返回,因此会话 id 为 1。

在我的 app.js 中,我有代码阻止您通过在 URL 中输入 /game 页面:

gameApp.run(function($rootScope, $location, loginService) {
    var routespermission=['/game']; //route that require login
    $rootScope.$on('$routeChangeStart', function() {
        if(routespermission.indexOf($location.path()) !=-1)
        {
            var connected = loginService.islogged();
            connected.then(function(msg) {
                console.log(msg);
                if(!msg.data) {
                    $location.path('/');
                }                   
            }); 
        }
    });
});

如您所见,我在这里使用我的 loginService,我指的是服务中的 islooged。在 islogged 中,我调用了我的 PHP 后端 check_session.php,在其中检查会话是否存在:

<?php
session_start();
if(isset($_SESSION['sess_id'])) {
    echo "authentified";
}
?>

这将返回一个空字符串,会话未设置。当我尝试 var_dump($_SESSION) 时,结果为 NULL。

当我登录时在后端设置会话,结果值为 1 时,这怎么可能?

【问题讨论】:

    标签: javascript php angularjs session


    【解决方案1】:

    您确定要使用 Angular 操作会话吗?

    会话存储在浏览器和服务器中,当您通过角度发起请求时,会话将由请求头自动携带,您可以在后端使用您的php函数验证它,所以我认为您应该检查您的php代码确认会话存储是否可用,或者您的浏览器可以通过 cookie 或会话存储来存储会话

    【讨论】:

    • 正如您在我的问题中看到的,我正在使用 php 验证它,在 check_session.php..
    • 设置一个会话并从另一个请求中获取它以查看会话是否存在?
    • 你能说得更具体点吗?
    • Sorry Im not a php developer,but with my experience,angular get/post` 一个请求,会话会自动添加请求Header,所以如果你不能从一个http请求中获取会话,也许你以前设置过会话失败
    • 会话创建当我点击登录按钮时,因为 return $_SESSION['sess_id'] 是 1,这是正确的。问题出在 check_session.php 中,这里似乎没有设置 $_SESSION['sess_id']?
    猜你喜欢
    • 2017-10-07
    • 2014-01-24
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2017-03-22
    • 2017-12-16
    相关资源
    最近更新 更多