美文网首页
网站登陆及控制器统一验证、ajax统一验证

网站登陆及控制器统一验证、ajax统一验证

作者: 韩小禹 | 来源:发表于2020-07-13 15:07 被阅读0次
    • 登陆控制器
    <?php
    
    namespace app\controllers;
    
    use yii;
    use yii\helpers\Json;
    use yii\helpers\HtmlPurifier;
    use yii\captcha\CaptchaAction;
    use app\models\Auth;
    
    class LoginController extends yii\web\Controller
    {
        public $enableCsrfValidation = false;
    
        public function actions()
        {
            return [
                'error' => [
                    'class' => 'yii\web\ErrorAction',
                ],
                'captcha' => [
                    'class' => 'yii\captcha\CaptchaAction',
                    'maxLength'=>4,
                    'minLength'=>4,
                    'padding'=>5,
                    'height'=>39,
                    'width'=>100,
                    'offset'=>3,
                ],
            ];
        }
    
        public function actionLogin()
        {
             $this->layout = false;
             if (Yii::$app->request->isPost){
                 // 一些表单验证的逻辑代码,此处省略
                 $lifetime = 3600;   // 1小时
                 ini_set('session.gc_maxlifetime', $lifetime); // 秒
                 ini_set("session.cookie_lifetime",$lifetime); // 秒
                 Yii::$app->session['expiretime'] = time() + $lifetime;
                 Yii::$app->session['username'] = $username;
                 return Json::encode(['status'=>2,'msg'=>'登陆成功','username' =>$username]);
             }else{
                 if (isset(Yii::$app->session['username']) && isset(Yii::$app->session['expiretime'])) {
                     return $this->redirect(['index/index']);
                     Yii::$app->end();
                 }
             }
             return $this->render("login");
         }
    
         /**
         * [actionLogout 登出]
         * @return [type] [description]
         */
         public function actionLogout()
         {
              Yii::$app->session->removeAll();
              return $this->redirect(['login/login']);
              Yii::$app->end();
          }
    }
    
    • 父级控制器(除登陆控制器之外,都需要继续这个控制器)
    class BaseController extends Controller
    {
        public function init()
        {
            if($this->checkLogin() === false) {
                return $this->redirect(['/login/login']);
                Yii::$app->end();
            }
        }
    
        /**
         * [checkLogin description]
         * @return [type] [description]
         */
        public function checkLogin()
        {
            $expiretime = isset($_SESSION['expiretime']) ? $_SESSION['expiretime'] : null;
            $username = isset($_SESSION['username']) ? $_SESSION['username'] : null;
            $lifetime = 3600;   // 1小时
    
            if( $expiretime !== null && $username !== null) {
                if($expiretime < time() || !isset($username)) {
                    unset($_SESSION['expiretime']);
                    unset($_SESSION['username']);
                    return false;
                } else {
                    $_SESSION['expiretime'] = time() + $lifetime;   // 刷新时间戳
                    $_SESSION['username'] = $username;
                    return true;
                }
            }
            return false;
        }
    }
    
    • 处理session过期时ajax请求无反应,统一处理http状态。可以加载layouts的公共页面中。
    <script type="text/javascript">
    $(function(){
        $.ajaxSetup({
            type:"POST",
            cache:false,
            dataType:'JSON',
            error:function(jqXHR,textStatus,errorThrown){
                switch(jqXHR.status){
                    case(403):
                        $(location).attr('href', '/login/login');
                        break;
                    default:
                        //
                }
            },
        });
    });
    </script>
    

    相关文章

      网友评论

          本文标题:网站登陆及控制器统一验证、ajax统一验证

          本文链接:https://www.haomeiwen.com/subject/cnkzqktx.html