2015-05-07 13 views
8

Di solito la documentazione del dardo ha molti esempi utili su quasi tutti gli argomenti. Purtroppo non ho trovato nulla nelle sessioni in dardo.Sessioni in freccetta

si poteva convalidare questo approccio come un modo corretto di fare le sessioni:

  1. browser invia GET richiesta di recidere.
  2. Il server risponde con il web-client.
  3. Il client Web invia le credenziali dell'utente.
  4. a) Il server verifica le credenziali e genera il cookie di sessione. b) Il server invia di nuovo il cookie di sessione al client.
  5. Il client Web memorizza i cookie per un ulteriore utilizzo.
  6. Il client Web invia la richiesta di alcuni dati specifici dell'utente e allega il cookie per la verifica.

Il mio interesse particolare è nei punti 4, 5 e 6, poiché gli altri sono ben documentati. Se potessi condividere alcuni snippet di codice su questi punti, lo apprezzerei molto.

MODIFICA: Dopo aver letto il commento di Günter Zöchbauer in basso ho cercato su shelf_auth. Mi sono reso conto che è necessario riscrivere l'app del server per utilizzare lo scaffale. Quindi l'ho fatto.

Il main.dart:

// imports of all necessary libraries 

main() { 
    runServer(); 
} 


/** 
* Code to handle Http Requests 
*/ 
runServer() { 
    var staticHandler = createStaticHandler(r"C:\Users\Lukasz\dart\auctionProject\web", defaultDocument: 'auctionproject.html'); 
    var handler = new Cascade() 
         .add(staticHandler) // serves web-client 
         .add(routes.handler) // serves content requested by web-client 
         .handler; 
    io.serve(handler, InternetAddress.LOOPBACK_IP_V4, 8080).then((server) { 
    print('Listening on port 8080'); 
    }).catchError((error) => print(error)); 
} 

Il routes.dart

import 'handlers.dart' as handler; 

import 'package:shelf_route/shelf_route.dart'; 
import 'package:shelf_auth/shelf_auth.dart' as sAuth; 

Router routes = new Router() 
     ..get('/anonymous', handler.handleAnonymousRequest); 
     //..post('/login', handler.handleLoginRequest); << this needs to be implemented 
         //other routs will come later 

Il handlers.dart

import 'dart:async'; 
import 'dart:convert'; 
import 'dart:io' show HttpHeaders;  
import 'databaseUtility.dart'; 
import 'package:shelf_exception_response/exception.dart'; 
import 'package:shelf/shelf.dart' as shelf; 
import 'package:shelf_path/shelf_path.dart'; 


shelf.Response handleAnonymousRequest(shelf.Request request) { 
    return new shelf.Response.ok('got anonymous get request'); 
} 

Purtroppo dopo aver letto la documentazione shelf_auth io ancora non del tutto sapere dove aggiungere l'autenticazione. Usano la sintassi Pipline per il gestore.

+0

Io uso il gestore di sessione di https://pub.dartlang.org/packages/shelf_auth per questo scopo. –

+0

@ GünterZöchbauer potrebbe per favore dare un'occhiata al codice sopra. – Lukasz

+0

Non avrò tempo oggi, forse domani ... –

risposta

2

Descriverò come funziona la sessione in Java con i servlet . Questo potrebbe aiutarti a far funzionare la tua implementazione. Innanzitutto, devo menzionare che la sessione sessione e l'autenticazione sono due funzioni separate, sebbene quest'ultima dipenda dal primo.

Una sessione consente al server di comprendere le richieste consecutive provenienti dallo stesso browser senza un grande periodo di inattività.Date un'occhiata al seguente esempio:

  1. un utente apre un browser A, visitato il vostro sito
  2. Kept cliccando in giro vari collegamenti utilizzando più schede in del browser Un
  3. Sinistra l'inattività del browser per 45 minuti
  4. Continua clic sulle pagine che ha lasciato aperta
  5. Inaugurato del browser B, ha visitato il vostro sito
  6. ha chiuso la scheda per il tuo sito in del browser B
  7. aperto un'altra nuova scheda in del browser B e cliccato su un segnalibro per visitare il tuo sito

Qui è l'impatto sulla sessione lato server per i passaggi precedenti degli utenti:

  1. Nuova sessione creato ... diciamo JSESSIONID 10203940595940
  2. stessa sessione si applica per tutte le richieste provenienti da tutte le schede
  3. sessione scaduta sul server, e, probabilmente, un po 'di memoria è stato liberato sul server di
  4. Sinc e Java non è in grado di localizzare una sessione corrispondente a JSESSIONID 10203940595940, crea una nuova sessione e chiede al client di ricordare il nuovo JSESSIONID w349374598457
  5. Le richieste dal nuovo browser vengono considerate come nuove sessioni perché il contratto JSESSIONID si trova tra un singolo browser e il server . Quindi, il server assegna un nuovo JSESSIONID come 956879874358734
  6. JSESSIONID si blocca nel browser fino alla chiusura del browser. La chiusura di una scheda non cancella il JSESSIONID
  7. JSESSIONID è ancora utilizzato dal browser e, se non è trascorso molto tempo, il server sarebbe ancora in attesa di quella sessione. Quindi, la Sesison continuerà.

uso sessione sul lato server:

  • Una sessione è solo un HashMap che mappa JSESSIONIDs con un altro un gruppo di attributi.
  • C'è un tempo trascorso di monitoraggio del thread per le sessioni e rimozione di JSESSIONID e degli attributi mappati dalla memoria una volta scaduta una sessione .
  • In genere, alcune applicazioni consentono di ricevere un avviso di evento solo quando una sessione è pronta per la scadenza.

modalità d'attuazione: navigatore

  • utente A invia una richiesta al server. Il server verifica se c'è un un cookie per nome JSESSIONID. Se non viene trovato, ne viene creato uno sul server . Il server prende nota del nuovo JSESSIONID, dell'orario creato e dell'ora dell'ultima richiesta, che è lo stesso dell'orario creato nel caso . Nella risposta HTTP, il server allega il nuovo JSESSIONID come cookie.
  • I browser sono progettati per continuare ad allegare cookie per le successive visite allo stesso sito.Pertanto, per tutte le visite successive al sito, il browser continua ad allegare il cookie JSESSIONID alla richiesta HTTP .
  • Quindi, questa volta il server vede il JSESSIONID ed è in grado di mappare la richiesta alla sessione esistente, nel caso in cui la sessione non sia ancora scaduta . Nel caso in cui la sessione fosse già scaduta, il server avrebbe creare una nuova sessione e ricollegare il nuovo JSESSIONID come cookie nella risposta HTTP.

I meccanismi di autenticazione utilizzano semplicemente la gestione della sessione sopra per rilevare "nuove sessioni" e trasferirle alla pagina di accesso. Inoltre, le sessioni esistenti potrebbero essere utilizzate per memorizzare attributi come "auth-status" - "pass" o "fail".