AngularJs用戶登錄的交互及驗證、阻止翻牆處理
1. 靜態頁面搭建及ng的form表單驗證實現:
1 <div class="register-frame-all"> 2 <div class="register-frame"> 3 <div class="register-msg"> 4 <i></i> 5 <form name="loginForm" ng-submit="loginAction()"> 6 <div class="form-group"> 7 <div class="input-group"> 8 <span class="input-group-addon register-user"></span> 9 <input autocomplete="off" type="number" class="form-control" placeholder="請輸入手機號" required ng-model="loginData.loginName" name="loginName"> 10 </div> 11 <div class="input-group"> 12 <span class="input-group-addon register-pwd"></span> 13 <input type="password" class="form-control" placeholder="請輸入密碼" required ng-model="loginData.pwd" name="pwd"> 14 </div> 15 <button type="submit" class="btn btn-block btn-danger" 16 ng-disabled="!( (loginForm.loginName.$valid) && (loginForm.pwd.$valid) )">登錄</button> 17 <em></em> 18 </div> 19 </form> 20 </div> 21 <div class="register-pic" ng-style="registerRnum"></div> 22 </div> 23 </div>
2. 定義用戶登錄的控制器,在控制器中使用http服務處理登錄接口:
1 $http({ 2 url:G.apiUrl_dl+'loginByPhone', 3 method:'post', 4 data:{ 5 'phone':loginName, 6 'pwd':pwd 7 }, 8 headers:{'Content-Type':'application/x-www-form-urlencoded'}, 9 transformRequest: function(obj) { 10 var str = []; 11 for(var p in obj){ 12 str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 13 } 14 return str.join("&"); 15 } 16 }).success(function(data){ 17 // 登錄成功或失敗后的邏輯操作 18 });
3. 如果登錄成功后將用戶的數據保存到cookie或session中 用$state服務進行跳轉到指定的頁面中:
1 // 登錄成功 2 if($scope.loginActionData.token){ 3 sessionStorage.setItem("token", $scope.loginActionData.token); 4 sessionStorage.setItem("tsname", $scope.loginActionData.name); 5 sessionStorage.setItem("rights", $scope.loginActionData.rights); 6 sessionStorage.setItem("userId", $scope.loginActionData.userId); 7 sessionStorage.setItem("departmentsId", $scope.loginActionData.departmentsId); 8 sessionStorage.setItem("departmentsName", $scope.loginActionData.departmentsName); 9 $state.go('index'); 10 }else{ 11 // 登錄失敗后彈出提示框提示 12 $('#loginAction').modal('show'); 13 }
4. 接下來就是防止用戶跳過登錄頁面通過其他方法(如在地址欄直接輸出地址進入頁面) 的防翻牆操作:
這個方法的操作我放在之前曾經說過得控制器最先執行的run方法中執行,每次進到一個頁面之前都會進行檢查該用戶是否合法登錄,如果不是合法登錄我們將會讓他跳轉到登錄頁面
1 angular.module.run(['$rootScope','$state',function($rootScope,$state){ 2 $rootScope.$on('$stateChangeStart',function(event,toState){ 3 // 防止翻牆 4 if(!(sessionStorage.getItem("token")))$state.go('register'); 5 }); 6 }]);