2016-07-29 8 views
0

Ich zeige einen Front-End-Countdown von, wenn die Sitzung des Benutzers abläuft, möchte ich die verbleibende Zeit anfordern, ohne es zu aktualisieren.Laravel Session eine Anfrage ohne Aktualisierung Sitzungen Ablauf

Hier ist, was ich bisher:

$ttl = Redis::ttl(config('cache.prefix') . ':' . Session::getId()); 
return response()->json($ttl); 

Jedesmal, wenn diese die ttl angefordert wird, wird zurück zum session.lifetime Wert zurückgesetzt.

+0

Welchen Sitzungstreiber verwenden Sie? –

+0

Sie könnten auch sicher einen Countdown haben, der der Länge der Sitzung entspricht, die beginnt, wenn die Anfrage gestellt wird? –

+0

Ich benutze Redis. Und ja, ich könnte das tun, aber wenn ein anderes Tab geöffnet ist, das es zurücksetzt, wird es nicht aktualisiert. – Petecoop

Antwort

0

Ich löste dies durch die StartSession Middleware erstreckt:

class StartSession extends \Illuminate\Session\Middleware\StartSession 
{ 

    public function terminate($request, $response) 
    { 
     if (!$request->is('auth/ping')) { 
      parent::terminate($request, $response); 
     } 
    } 

} 

Wo auth/ping ist die Route, ich möchte nicht die Sitzung auf speichern.

ich registrierte diese dann in dem App Container als Singleton, so dass das Verfahren auf die gleiche Instanz beenden löst:

In AppServiceProvider->register:

$this->app->singleton('App\Http\Middleware\StartSession'); 
0

Die vorhandene mapWebRoutes() -Methode in app/Providers/RouteServiceProvider.php sieht so aus.

/** 
* Define the "web" routes for the application. 
* 
* These routes all receive session state, CSRF protection, etc. 
* 
* @param \Illuminate\Routing\Router $router 
* @return void 
*/ 
protected function mapWebRoutes(Router $router) 
{ 
    $router->group([ 
     'namespace' => $this->namespace, 'middleware' => 'web', 
    ], function ($router) { 
     require app_path('Http/routes.php'); 
    }); 
} 

Sie können einfach so etwas wie die folgenden zu dieser Methode hinzufügen, oder Sie können den Code, über dem lädt routes.php und entfernen Sie die Web-Middleware duplizieren.

$router->get('session-ttl', function() { 
    return response()->json(
    \Redis::ttl(config('cache.prefix') . ':' . cookie(config('session.cookie'))); 
); 
}); 

Oder

$router->group([ 
    'namespace' => $this->namespace 
], function ($router) { 
    require app_path('Http/routes_wo_web.php'); 
}); 
+0

Danke, dass ich den RouteServiceProvider nicht angesehen habe. Ich bemerkte, dass das Projekt ursprünglich mit 5.1 erstellt und dann auf 5.2 aktualisiert wurde, damit es ein wenig anders aussieht. Ich habe die Methode 'StartSession' Middleware' terminate' erweitert, um zu überprüfen, ob die Anfrage dem Pfad entspricht. Ich denke, es ist die einfachere Lösung, da ich die Sitzung innerhalb dieser Route immer noch verwenden kann, um bei Bedarf Werte abzurufen. – Petecoop

0

Die Sitzung Sachen von der Illuminate\Session\Middleware\StartSession Middleware behandelt werden, Das ist in der web Middleware-Gruppe.

Die einfachste Lösung wäre, Ihre Route außerhalb der Standard-Middlewaregruppe web zu platzieren.

Wenn Sie eine der anderen web Middleware benötigen, können Sie sie zurück zur Route hinzufügen.

tatsächlich Um die Sitzung in Ihrer Route zu verwenden, haben Sie ein paar Optionen:

  • Sie können eine Session-Middleware machen, die nicht die Sitzung nicht beendet (erweitern die bestehende und überschreiben die handle Methode nur)
  • jemand hier vorgeschlagen, dass, wie es eine one-off-Route ist, könnten Sie einfach die Sitzung manuell starten, wo immer Sie Ihre Route (Nick den Code von der vorhandenen Middleware - es ist nur ein paar Zeilen).

Ich denke, die empfohlene Lösung wäre, es in einer Middleware zu tun, obwohl.

+0

Danke, mein Projekt wurde mit Laravel 5.1 erstellt und auf 5.2 aktualisiert, also war es in der globalen Middleware und nicht in der 'web' Gruppe. Siehe meine Antwort - Ich habe die aktuelle 'StartSession'-Middleware erweitert und die 'terminate'-Methode geändert. – Petecoop

Verwandte Themen