Håndtering af cookies og en session i en Java Servlet

1. Oversigt

I denne vejledning dækker vi håndtering af cookies og sessioner i Java ved hjælp af Servlets.

Derudover vil vi kort beskrive, hvad en cookie er, og undersøge nogle eksempler på brugssager til den.

2. Grundlæggende cookie

Kort fortalt, en cookie er et lille stykke data, der er gemt på klientsiden, som servere bruger, når de kommunikerer med klienter.

De er vant til at identificere en klient når du sender en efterfølgende anmodning. De kan også bruges til at overføre nogle data fra en servlet til en anden.

For flere detaljer henvises til denne artikel.

2.1. Opret en cookie

Det Cookie klasse er defineret ijavax.servlet.http pakke.

For at sende det til klienten skal vi Opret en og tilføj den til svaret:

Cookie uiColorCookie = ny cookie ("farve", "rød"); response.addCookie (uiColorCookie); 

Imidlertid er dets API meget bredere - lad os udforske det.

2.2. Indstil udløbsdatoen for cookien

Vi kan indstille den maksimale alder (med en metode maxAge (int)), der definerer, hvor mange sekunder en given cookie skal være gyldig i:

uiColorCookie.setMaxAge (60 * 60); 

Vi indstiller en maksimal alder til en time. Efter dette tidspunkt kan cookien ikke bruges af en klient (browser), når der sendes en anmodning, og den skal også fjernes fra browserens cache.

2.3. Indstil cookiedomænet

En anden nyttig metode i Cookie API er setDomain (streng).

Dette giver os mulighed for at specificere domænenavne, som det skal leveres af klienten til. Det afhænger også af, om vi specifikt angiver domænenavn eller ej.

Lad os indstille domænet for en cookie:

uiColorCookie.setDomain ("eksempel.com");

Cookien leveres til hver anmodning fra eksempel.com og dets underdomæner.

Hvis vi ikke specifikt angiver et domæne, indstilles det til domænenavnetsom skabte en cookie.

For eksempel, hvis vi opretter en cookie fra eksempel.com og lad domænenavnet være tomt, så leveres det til www.eksempel.com (uden underdomæner).

Sammen med et domænenavn kan vi også angive en sti. Lad os se på det næste.

2.4. Indstil cookiestien

Stien angiver, hvor en cookie skal leveres.

Hvis vi udtrykkeligt angiver en sti, så er en Cookie vil blive leveret til den givne URL og alle dens underkataloger:

uiColorCookie.setPath ("/ welcomeUser");

Implicit indstilles den til den URL, der oprettede en cookie og alle dens underkataloger.

Lad os nu fokusere på, hvordan vi kan hente deres værdier i en Servlet.

2.5. Læs cookies i Servlet

Cookies føjes til anmodningen fra klienten. Klienten kontrollerer sine parametre og beslutter, om den kan levere den til den aktuelle URL.

Vi kan få alle cookies ved at ringe getCookies () på anmodning (HttpServletRequest) videregivet til Servlet.

Vi kan gentage dette array og søge efter det, vi har brug for, f.eks. Ved at sammenligne deres navne:

offentlig valgfri readCookie (strengnøgle) {returnerer arrays.stream (anmodning.getCookies ()) .filter (c -> key.equals (c.getName ())) .map (Cookie :: getValue) .findAny (); }

2.6. Fjern en cookie

Tilfjerne en cookie fra en browser, skal vi tilføje en ny til svaret med samme navn, men med en maxAlder værdi indstillet til 0:

Cookie-brugernavnCookieRemove = ny cookie ("brugernavn", ""); userNameCookieRemove.setMaxAge (0); response.addCookie (userNameCookieRemove);

Et eksempel på en brugssag til fjernelse af cookies er en brugerlogouthandling - vi skal muligvis fjerne nogle data, der blev gemt til en aktiv brugersession.

Nu ved vi, hvordan vi kan håndtere cookies inde i en Servlet.

Dernæst dækker vi et andet vigtigt objekt, som vi ofte får adgang til fra en Servlet - a Session objekt.

3. HttpSession Objekt

Det HttpSession er en anden mulighed for lagring af brugerrelaterede data på tværs af forskellige anmodninger. En session er et serverlager, der indeholder kontekstuelle data.

Data deles ikke mellem forskellige sessionsobjekter (klienten kan kun få adgang til data fra sin session). Den indeholder også nøgleværdipar, men i sammenligning med en cookie kan en session indeholde objekt som en værdi. Lagringsimplementeringsmekanismen er serverafhængig.

En session matches med en klient af en cookie eller anmodningsparametre. Mere info kan findes her.

3.1. At få en session

Vi kan få en HttpSession direkte fra en anmodning:

HttpSession session = request.getSession (); 

Ovenstående kode opretter en ny session, hvis den ikke findes. Vi kan opnå det samme ved at kalde:

request.getSession (sand)

Hvis vi bare vil hente eksisterende session og ikke oprette en ny, skal vi bruge:

request.getSession (falsk) 

Hvis vi åbner JSP-siden for første gang, oprettes en ny session som standard. Vi kan deaktivere denne adfærd ved at indstille session attribut til falsk:

I de fleste tilfælde bruger en webserver cookies til sessionsstyring. Når et sessionobjekt oprettes, opretter en server en cookie med JSESSIONID nøgle og værdi, der identificerer en session.

3.2. Session Egenskaber

Sessionsobjektet giver en række metoder til at få adgang til (oprette, læse, ændre, fjerne) attributter oprettet til en given brugersession:

  • setAttribute (streng, objekt) som opretter eller erstatter en sessionsattribut med en nøgle og en ny værdi
  • getAttribute (streng) der læser en attributværdi med et givet navn (nøgle)
  • removeAttribute (streng) som fjerner en attribut med et givet navn

Vi kan også let kontrollere allerede eksisterende sessionsattributter ved at ringe getAttributeNames ().

Som vi allerede nævnte, kunne vi hente et sessionobjekt fra en anmodning. Når vi allerede har det, kan vi hurtigt udføre de ovennævnte metoder.

Vi kan oprette en attribut:

HttpSession session = request.getSession (); session.setAttribute ("attributeKey", "Sample Value"); 

Attributværdien kan fås ved hjælp af dens nøgle (navn):

session.getAttribute ("attributKey"); 

Vi kan fjerne en attribut, når vi ikke længere har brug for den:

session.removeAttribute ("attributKey"); 

En velkendt brugssag til en brugersession er at annullere hele data, den gemmer, når en bruger logger ud fra vores websted. Sessionsobjektet giver en løsning på det:

session.invalidate (); 

Denne metode fjerner hele sessionen fra webserveren, så vi ikke længere kan få adgang til attributter fra den.

HttpSession objekt har flere metoder, men den, vi nævnte, er den mest almindelige.

4. Konklusion

I denne artikel dækkede vi to mekanismer, der giver os mulighed for at gemme brugerdata mellem efterfølgende anmodninger til serveren - cookien og sessionen.

Husk, at HTTP-protokollen er statsløs, og det er derfor et must at opretholde tilstand på tværs af anmodninger.

Som altid er kodeuddrag tilgængelige på Github.