【问题标题】:Laravel-5.3 : Updating session not working properlyLaravel-5.3:更新会话无法正常工作
【发布时间】:2017-06-17 14:33:05
【问题描述】:

我正在使用数据库驱动程序来存储会话。当我更新有效负载时,取决于有效负载中的数据的视图不会更新。

在我看来,我经常有这样的事情:

@if( Session::get('quicktrade') == 'Client' )
    <li class="@if ($coreData['navParent'] == 'quicktrade') active open @endif">
        <a href="javascript:;">
        <i class="ico-quicktrade-{{Session::get('left_menu')}}"></i>
        <span class="title">QUICK[TRADE]</span>
        <span class="arrow @if ($coreData['navParent'] == 'quicktrade') open @endif"></span>
    @if ($coreData['navParent'] == 'quicktrade') <span class="selected"></span> @endif
        </a>
        <ul class="sub-menu">
            @if( Session::get('quicktrade_evaluation') == 1 )
            <li class="@if ($coreData['navChild'] == 'evaluation') active @endif">
                <a href="{{ url('/quicktrade/evaluation') }}">
                NOUVELLE ÉVALUATION</a>
            </li>
            @endif
            @if ( Session::get('quicktrade_liste') == 1 )
            <li class="@if ($coreData['navChild'] == 'liste') active @endif">
                <a href="{{ url('/quicktrade/liste') }}">
                LISTE DES VÉHICULES</a>
            </li>
            @endif
            @if ( Session::get('quicktrade_statistiques') == 1 )
            <li class="@if ($coreData['navChild'] == 'statistiques') active @endif">
                <a href="{{ url('/quicktrade/statistiques') }}">
                STATISTIQUES</a>
            </li>
            @endif
        </ul>
    </li>
@endif

这使菜单是否显示选项取决于会话。
在 LogSuccesfulLogin 事件期间,所有数据都将添加到有效负载中。
因此,如果用户注销然后登录,我在用户表中进行一些更改时没有问题。

问题是会话处于活动状态且用户未注销时。如果我进行一些更改,视图将保持与以前相同。

在我的用户控制器中发生了什么:

$user = User::with('acces')->find($user->id);

$sessions = DB::table('sessions')->where('user_id', $user->id)->get();
foreach ($sessions as $session) {
    $payload = unserialize(base64_decode($session->payload));
    $payload['oneaction'] = $user->acces->oneaction;
    $payload['oneaction_type'] = $user->acces->oneaction_type;
    if ($user->acces->oneaction == 'Client') {
        $payload['oneaction_clients'] = $user->acces->oneaction_clients;
        $payload['oneaction_list'] = $user->acces->oneaction_list;
        $payload['oneaction_creator'] = $user->acces->oneaction_creator;
    } else {
        $payload['oneaction_clients'] = 0;
        $payload['oneaction_list'] = 0;
        $payload['oneaction_creator'] = 0;
    }
    //dd($payload);
    $payload = base64_encode(serialize($payload));
    DB::table('sessions')->where('id', $session->id)->update(['payload' => $payload]);
}

$sessions = DB::table('sessions')->where('user_id', $user->id)->get();
foreach ($sessions as $session) {
    $payload = unserialize(base64_decode($session->payload));
    //dd($payload);
}

正如您在上面的代码中看到的,有 2 个dd()。两者都向我表明更改已正确完成。当我重新加载页面时,左侧菜单没有变化。
我尝试在会话更新后立即执行php artisan view:clear,但问题仍然存在。
我能够完成这项工作的唯一方法是将用户的所有会话删除到表中。我不想走这条路,所以我错过了什么?为什么更新会话没有像我预期的那样工作?

【问题讨论】:

    标签: php session laravel-5.3


    【解决方案1】:

    您的会话可能会丢失,因为您的响应不包含会话 cookie。在 laravel 中,这是通过 AddQueuedCookiesToResponse 中间件完成的,该中间件在您的 HTTP-Kernel 中启动。但是由于您在控制器的某个地方转储并死亡,因此您正在阻止此中间件运行。

    请注意,这只是一种猜测,您的 cookie 丢失可能还有其他原因。检查您的内核,也许还检查您的config,并确保您可以在http response header 中看到您的cookie。

    【讨论】:

    • 如果我理解得很好,会话在用户登录时存储到客户端。由于在 LogSuccesfulLogin 事件期间我的应用程序 set() 属性,即使我更改了数据库上的有效负载,这也不会更改客户端的数据,因为令牌仍然匹配并且客户端不会刷新数据。所以,现在我有2个选择。当我更改他的权限时删除用户的所有会话,或者找到一种方法来更改每个请求的有效负载?对吗?
    • 我更改了设置我将有效负载更改为/* */ 的代码并添加了这一行$sessions = DB::table('sessions')-&gt;where('user_id', $user-&gt;id)-&gt;delete();。它完成了这项工作,我真的不喜欢它是如何做到的。它会在不注销用户的情况下生成一个新会话。我会这样做,直到我能弄清楚如何在不删除每个会话的情况下更改客户端的负载。
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2017-05-10
    • 2015-05-10
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多