Învățarea serverelor java - java - salvarea stării clientului

Urmărirea sesiunii este un mecanism pe care servletele îl utilizează pentru a menține starea între o serie de solicitări din partea aceluiași utilizator (solicitări făcute dintr-o fereastră de browser) pentru o anumită perioadă de timp.

Sesiunile sunt utilizate de servlet-uri diferite pentru a accesa un client. Acest lucru este util pentru aplicațiile construite pe mai multe servlete. De exemplu, Bookstore-ul lui Duke folosește urmărirea sesiunilor pentru a stoca cărți selectate de client. Toate servletele din exemplu au acces la sesiunea de utilizator.

Pentru a utiliza urmărirea sesiunilor:

Să luăm sesiunea

Metoda getSession a obiectului HttpServletRequest returnează o sesiune de utilizator. Când apelați această metodă cu argumentul creați setat la true. Timpul de execuție creează o sesiune, dacă este necesar.

Pentru a organiza corect o sesiune, trebuie să apelați metoda getSession înainte ca fluxul de răspuns al ieșirii să fie pornit. (Dacă răspunsul dvs. utilizează Writer, trebuie să apelați metoda getSession înainte de a avea acces la Writer înainte de a trimite datele de răspuns.)

Un exemplu de librărie Duke utilizează urmărirea sesiunii pentru a stoca informații despre cărți din coșul de cumpărături pentru utilizator. Iată un exemplu de servlet CatalogServlet al unui utilizator care stabilește sesiunea:

Salvarea și recuperarea datelor sesiunii

Interfața HttpSession oferă metode care stochează și returnează date:

  • Proprietățile sesiunii standard, cum ar fi ID-ul sesiunii.
  • Datele aplicației care sunt salvate ca o pereche cu o cheie de nume atunci când numele este un șir (String) și valoarea este un obiect Java. (Ca java.util.Dictionary.) Pentru că utilizați mai multe servlete pentru a accesa sesiunea utilizatorului, trebuie să alegeți denumirea condiționată pentru a organiza numele corespunzătoare datelor de utilizator. Acest lucru va permite servlet-urilor să evite suprascrierea accidentală a unor cantități cu altele. Una dintre aceste convenții este servletname.name. unde servletname este numele complet al servletului, inclusiv pachetul său. De exemplu, com.acme.WidgetServlet.state această filă cu numele și numele statului servlet com.acme.WidgetServlet.

Un exemplu de librărie Duke utilizează urmărirea sesiunii pentru a stoca informații despre cărți din coșul de cumpărături pentru utilizator. Iată un exemplu de servlet CatalogServlet care primește un ID de sesiune de utilizator care primește și stabilește datele corespunzătoare sesiunii utilizatorului respectiv:

Deoarece un obiect poate fi asociat unei sesiuni, exemplul librăriei lui Duke stochează cărțile selectate de utilizator în obiect. Acest tip de ShoppingCart obiect și fiecare carte selectat de către utilizator este stocat în coșul de cumpărături, adică, în ShoppingCartItem obiect. De exemplu, iată ce se întâmplă în metoda doGet a servletului CatalogServlet:

În concluzie, menționăm că sesiunea poate fi concepută ca una nouă. Sesiune nouă - dacă metoda isNew din clasa HttpSession revine la adevărat. arată, de exemplu, că clientul nu a instalat încă sesiunea. De la noile sesiuni, datele nu sunt încă asociate.

Trebuie să rezolvați situațiile care cauzează sesiuni noi. În exemplul de carte de la Duke's Book, mai sus, dacă utilizatorul nu are un coș de cumpărături (singurele date asociate sesiunii), servletul creează unul nou. Pe de altă parte, dacă aveți nevoie de informații de utilizator pentru a deschide o sesiune (cum ar fi un nume de utilizator), puteți redirecționa utilizatorul la "pagina de start", unde veți primi toate informațiile necesare.

Sfârșitul sesiunii

Sesiunea de utilizatori poate fi terminată manual sau, în funcție de locul în care servletul rulează automat. (De exemplu, Java Web Server încetează automat sesiunea atunci când nu apare nici o solicitare pentru o anumită perioadă de timp, implicit este de 30 de minute.) Terminarea sesiunii înseamnă eliminarea obiectului HttpSession și a valorilor acestuia din sistem.

Pentru a încheia manual o sesiune, utilizați metoda sesiunii de invalidare. Unele programe au deja puncte în care se încheie sesiunea. Un exemplu de librărie a lui Duke termină sesiunea unui utilizator după ce a cumpărat cărți. Acest lucru se întâmplă în servletul ReceiptServlet:

Gestionați toate browserele

În mod implicit, de urmărire sesiune utilizează marcaje pentru a asocia un identificator cu o sesiune de utilizator. Pentru a sprijini, de asemenea, că utilizatorii browser-ul nu funcționează cu marcaje, sau incluse în modul de a ignora-le, ar trebui să utilizați URL-ul rescrierea. (Deoarece unele servere susțin rescrierea URL-ul, care face parte din JSDK2.0 servletrunner de utilitate nu acceptă acest lucru. Pentru a follow-up sesiune la locul de muncă, atunci când servletul se execută cu ajutorul servletrunner. Clientul trebuie să accepte semne de carte.)

Când utilizați suprascrierea adresei URL, apelați metode atunci când este necesar, astfel încât identificatorul să fie inclus în link. Trebuie să utilizați aceste metode pentru fiecare referință în răspunsul servletului.

Notă: acesta este un cod care nu face parte din exemplul librăriei lui Duke pentru JSDK2.1. Un exemplu de librărie Duke poate conține un cod similar cu cel de mai jos, dacă a fost utilizată rescrierea URL-ului. Deoarece rescrierea URL-ului nu face parte din exemplul Duke's Bookstore. vom considera acest cod drept un pseudocod.

Dacă exemplul Librărie Duke folosit pentru a suprascrie URL-ul, am cod într-un CatalogServlet servlet ar putea arăta după cum urmează:

Când un utilizator dă clic pe adresa URL a adresei URL rescrise, servletul identifică și preia identificatorul sesiunii. Apoi, se utilizează metoda getSession. Obiectul HttpSession corespunzător identificatorului sesiunii

Și invers, dacă browserul utilizatorului nu acceptă marcaje, iar utilizatorul dă clic pe adresa URL ne-rescrisă, sesiunea utilizatorului dispare. Servletul, care interacționează prin acest link, creează o sesiune nouă, iar noua sesiune nu conține date din sesiunea anterioară corespunzătoare. Dacă servletul pierde datele de sesiune, aceste date se pierd pentru toate servlet-urile care le utilizează. De asemenea, ar trebui să utilizați metode de rescriere a adreselor URL dacă doriți servletul dvs. să suporte clienții care nu funcționează sau nu acceptă marcaje.