duanbozhong9689 2016-10-01 13:56
浏览 114
已采纳

使用Yii2通过AJAX登录设置cookie时遇到问题

I'm using Yii2 and I have setup a login process which works fine (cookies as well) via the standard login page which is not AJAX.

I have built a dropdown login field which works fine at logging them in, however it doesn't seem to set the cookie as the user doesn't stay logged in and there is no bookie created.

I figured that this was because of AJAX and the cookie wasn't being created on the users system, but upon further reading it seems it should work.

I have verified that the cookie value is being set correctly, the only issue is the cookie doesn't seem to being created.

My login code:

JS:

function doLogin() {

    // Set file to prepare our data
    var loadUrl = "../../user/login/";

    // Set parameters
    var dataObject = $('#login_form').serialize();

    // Set status element holder
    var status_el = $('#login_status');

    // Make sure status element is hidden
    status_el.hide();

    // Run request

    getAjaxData(loadUrl, dataObject, 'POST', 'json')

            .done(function(response) {

                if (response.result == 'success') {

                    //.......

                } else {

                    //.......

                }

            })

            .fail(function() {
                //.......
            });

    // End

}

function getAjaxData(loadUrl, dataObject, action, type) {

    if ($('meta[name="csrf-token"]').length) {
        // Add our CSRF token to our data object
        dataObject._csrf = $('meta[name="csrf-token"]').attr('content');
    }

    return jQuery.ajax({
        type: action,
        url: loadUrl,
        data: dataObject,
        dataType: type
    });

}

Controller:

public function actionLogin() {

    // Check if they already logged in

    if (!Yii::$app->user->isGuest and !Yii::$app->request->isAjax) {
        return $this->redirect('/');
    }

    if (Yii::$app->request->isAjax) {
        // Set our data holder
        $response = ['output' => '', 'result' => 'error'];
    }

    // Let's send the POST data to the model and see if their login was valid

    if (Yii::$app->request->isAjax and $this->user->validate() and $this->user->login()) {

        $response['result'] = 'success';

    } elseif (!Yii::$app->request->isAjax and Yii::$app->request->isPost and $this->user->validate() and $this->user->login()) {

        //.......

    } else {

        //.......

    }

    if (Yii::$app->request->isAjax) {
        echo Json::encode($response);
    }

}

Model:

public function login() {

    // Set cookie expire time
    $cookie_expire = 3600 * 24 * Yii::$app->params['settings']['cookie_expire'];

    return Yii::$app->user->login($this->getUser(), ($this->remember_me ? $cookie_expire : 0));

}
  • 写回答

1条回答 默认 最新

  • dongxin5429 2016-10-05 16:12
    关注

    As I suspected (see my earlier comment) response might not be correctly generated in case of simply echoing the data. Or maybe Content-Type header matters. If someone can confirm this it will be great.

    Anyway, I'm glad it works now (data needs to be returned).

    And you can use Response handy format as well.

    public function actionLogin() {
    
        // ...
    
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    
            return $response;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python