2017-05-24 09:53:33 3704次浏览 7条回答 0 悬赏 10 金钱

我按官方的源码在没改动的情况下开启了自动登录的功能

但是开启后发现登录后关闭浏览器下次打开他确实也是登录的状态,这是没有问题的

但是点退出Logout后 他确无法退出来,刷新还是登录的状态,关闭浏览器了重新打开他也还是登录的状态;那说明他根本就没有退出,没有清空Cookie

一步步跟踪到他有一个方法在USER类中

switchIdentity()

下面的

if ($this->enableAutoLogin) {
            $this->removeIdentityCookie();
        }

有执行删除Cookie的动作,但实际没有删除成功

在浏览器里面看到 _identity Cookie还存在
1111.png

而刷新页面的时候 他会去取Cookie然后自动登录
导致点了退出 一刷新又登录上去了

请问有没有那位大神用到自动登录功能后无法退出成功的问题呀;

这怎么解决呢?
如果不启用自动登录功能就可以正常退出,因为没有自动登录他根本就没有生成Cookie,只是清空Session·

补充于 2017-05-25 11:08

问题找到了 不是YII的问题是我自己写代码的问题,

我在跳转后用了一个EXIT();

就是因为他的问题 ,改成return false;就好了

但是我很奇怪 明明程序是按流程一步步走的,退出成功了才去exit(); 为什么还会造成影响;难道是在exit();的时候YII还有东西没有执行完这个有待去测试了

如:在一个正常的Controller中

logout();
redirect();
exit();
也就是说他应该先执行退出 完了最后才exit;呀 为什么加了这个就退出不了了,呵呵,这很奇怪!

补充于 2017-05-25 11:11

还真是,加了退不出来;

你们可以测试一下 直接在退出的操作后面加一个exit();或者die();

\Yii::$app->user->logout();
exit;//die();

他就无法退出成功了

  • 回答于 2017-05-24 09:57 举报

    你的cookie是不是readOnly了

    5 条回复
    回复于 2017-05-24 10:06 回复

    没有 都是默认的

    回复于 2017-05-24 10:06 回复

    没有 都是默认的

    回复于 2017-05-24 10:21 回复

    他的删除方式是把超时时间设置为一秒了,你看看cookie的超时时间

    回复于 2017-05-24 10:22 回复

    是的 我也看到了 是设置了时间为1秒
    但是为什么退不出来呢?

    回复于 2017-05-24 10:31 回复

    退出后你看看cookie有效期阿 是否设置成一秒了,还有就是你换个浏览器试试 ie 和非ie内核的,还有一个问题就是域名顶级域和二级域的一些操作,

  • 回答于 2017-05-24 10:00 举报

    cookie是无法删除的兄弟,要做的只能说是把session中的内容清空,由此可见,你对cookie和session并不是很了解。

    5 条回复
    回复于 2017-05-24 10:05 回复
    protected function removeIdentityCookie()
    {
        Yii::$app->getResponse()->getCookies()->remove(new Cookie($this->identityCookie));
    }
    

    那他这个怎么理解?

    我想知道 自动登录后为什么会退不出来?

    回复于 2017-05-24 10:17 回复

    你执行一下这个,然后刷新浏览器看看,cookie还在不,如果在,那你这句就没起作用,它根本就删不掉,浏览器当然是可以删掉的

    回复于 2017-05-24 10:19 回复

    为什么删不掉?因为你刚删了的时候,它又生成了,因为你一访问yii程序就生成。

    回复于 2017-05-24 10:21 回复

    执行了 确实还在!那这个问题比较麻烦了,不知道怎么解决了,自动登录后为啥就退不出来是 难道是Session的问题?

    回复于 2017-05-24 10:24 回复

    就是去处理session,把session中标识登录状态的那个值设置为null就可以了。然后判断是否为null就行了。

  • 回答于 2017-05-24 10:05 举报

    给你分析一下,当php中执行session_start()这个方法的时候就会产生cookie,这个cookie是临时的,也就是浏览器关闭再次打开的时候cookie中的value就会发生变化,如果你使用了记住密码功能,浏览器关闭再次打开cookie的value是不变的,你说删除cookie怎么删?当你访问网站的时候cookie就生成,而且cookie如果存在你是无法更新它的,所以你只能是去搞session,例如你使用$_SESSION['uid'] = 1;把$_SESSION['uid']设置为null,你判断这个是否为null就知道它是不是处于登录状态了。

    1 条回复
    回复于 2017-05-24 10:07 回复

    为什么我在浏览器里面 手动删除 _identity 在刷新他就退出来了?

  • 回答于 2017-05-24 14:10 举报

    看一下这个官网对退出是怎么处理的....
    logout.png
    对于_identity的内容设置为空了.
    login.png
    登陆状态都是有设置_identity的值.

    对于后台session 默认是有清空的,但是也可以根据传值$destroySession=false不清空

    if ($destroySession && $this->enableSession) {
        Yii::$app->getSession()->destroy();
    }
    
  • 回答于 2017-05-24 18:29 举报

    自动登录的意思就是在cookie中保存_identity,重新打开浏览器服务器读取到客户端的_identity,查找对应的session,没有则自动生成新的session,加载登录。仔细理解一下这个基本概念。

        'components' => [
            'user' => [
                'identityClass' => 'common\models\User',
                'enableAutoLogin' => true,//自动登录设置有效
    
  • 回答于 2017-05-24 21:00 举报

    点退出时,session也删除了

  • 回答于 2017-05-25 21:50 举报

    太深奥了。

您需要登录后才可以回答。登录 | 立即注册
xjcallen
见习主管

xjcallen 东莞

注册时间:2017-01-10
最后登录:2022-06-30
在线时长:6小时36分
  • 粉丝0
  • 金钱175
  • 威望0
  • 积分235

热门问题