【问题标题】:Retrieving a Session value in Laravel returns null在 Laravel 中检索 Session 值返回 null
【发布时间】:2018-10-29 02:58:04
【问题描述】:

我正在设置并尝试从 Laravel 应用程序中检索会话值。 Vue Js 前端正在对设置会话值的 Laravel 端点进行 API 调用。包含 Laravel 端点方法的控制器是:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
Use Session;

use App\User;

class UserController extends Controller
{
    public function adduser(Request $request) {

        $user = User::where( 'sub', $request->sub )->first();

        if(!$user) {

            $user = new User();

            $user->nickname = $request->nickname;
            $user->name = $request->name;
            $user->sub = $request->sub;
            $user->api_token = $request->api_token;

            $user->save();

        }

        $user->api_token = $request->api_token;
        $user->save();

        return response()
            ->json([
                'done' => $user->api_token
            ]);

    }

    //The endpoint for this method is http://localhost:8000/api/set
    public function setSession(Request $request) {


        $request->session()->put('info', 'testing vue client again');
        Session::save();

        return response()
            ->json([
                'done' => session('info')
            ]);

    }
    //The endpoint for this method is: http://localhost:8000/api/get
    public function getSession(Request $request) {

        $value = $request->session()->get('info');
        return response()
            ->json([
                'done' => $value
            ]);

    }

}

会话数据设置成功,但是当我尝试从 getSession() 方法检索此数据时,它返回 null。这是我用来尝试检索会话数据的Vue Js/axios代码sn-p

axios({
 method: 'get',
 url: 'http://localhost:8000/api/get',


}).then((res) => {
console.log(res.data)
})

我该如何解决这个问题?谢谢

【问题讨论】:

    标签: php laravel session vuejs2 session-variables


    【解决方案1】:

    我已经重现了这个问题,并且似乎是 cookie 有问题。 这对我有用:

    app\Http\Middleware\EncryptCookies.php

    protected $except = [
        'laravel_session',
    ];
    

    laravel_session 更改为您的 config('session.cookie') 值。

    Session ID changes on refresh (Laravel 5.4 + AngularJS 1.6)

    【讨论】:

    • 感谢您的回答。我刚刚去了 app\Http\Middleware\EncryptCookies.php 文件,发现$except 数组是空的。是这样的; protected $except = [ ]; 我在哪里可以找到 config('session.cookie') 值?
    • 它来自 config/session.php,cookie 键。并且可能值将是来自 .ENV + _sessionAPP_NAME。喜欢myproject_session。或者只是 print_r 这个表达式config('session.cookie')
    • 我已经做到了。在这种情况下,我的APP_NAMELaravel,所以我将Laravel_session 放入$except 数组中,但我仍然无法从我的Vue Js 前端检索会话数据。但是,当我使用 REST 客户端 Insomnia 时,它可以工作
    • 尝试重新加载页面并在您的前端再次设置此会话值。
    • 我已经尝试重新加载页面,但仍然无法正常工作
    【解决方案2】:

    默认情况下,来自 routes/api.php 文件的路由没有 StartSession 中间件,因为 api 调用被认为是无状态的。您可以像这样将这个带有EncryptCookies 的中间件添加到您的app/Http/Kernel.php 文件中的 api 中间件组中,具体顺序如下:

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    
        'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:60,1',
            'bindings',
        ],
    ];
    

    为我工作。另外,认为您可以将api 组设置为与您的情况完全相同的web 组。

    不要忘记使用新配置再次设置会话变量。

    【讨论】:

    • 感谢您的回答。我已经按照你在这里的建议做了,这就是为什么首先设置会话的原因。我现在面临的挑战是检索由于某种原因返回 null 的会话数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2014-03-05
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多