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

使用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;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 资源管理器无法使用且一直崩溃重启
  • ¥15 用sql语句完成下列问题
  • ¥50 yalmip+Gurobi 求解线性规划
  • ¥15 微信开发者工具/云函数/数据库
  • ¥15 如何导出数据库中的表格
  • ¥15 Torch not compiled with CUDA enabled
  • ¥15 三种节点编号优化算法比较
  • ¥15 比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
  • ¥115 用Java解决探地雷达dzt文件的解析过程
  • ¥20 有关神经网络这道(b)determine the parameters of neural network