Omgaan met cookies en een sessie in een Java-servlet

1. Overzicht

In deze tutorial behandelen we de afhandeling van cookies en sessies in Java met behulp van Servlets.

Bovendien zullen we in het kort beschrijven wat een cookie is, en enkele voorbeelden van gebruik ervan onderzoeken.

2. Basisprincipes van cookies

Simpel gezegd, een cookie is een klein stukje gegevens dat aan de clientzijde wordt opgeslagen en die servers gebruiken bij de communicatie met clients.

Ze worden gebruikt om een ​​klant te identificeren bij het verzenden van een volgend verzoek. Ze kunnen ook worden gebruikt om bepaalde gegevens van de ene servlet naar de andere door te geven.

Raadpleeg dit artikel voor meer informatie.

2.1. Maak een Cookie

De Koekje klasse is gedefinieerd in dejavax.servlet.http pakket.

Om het naar de klant te sturen, moeten we maak er een aan en voeg deze toe aan het antwoord:

Cookie uiColorCookie = nieuwe Cookie ("kleur", "rood"); response.addCookie (uiColorCookie); 

De API is echter veel breder - laten we hem eens verkennen.

2.2. Stel de vervaldatum van de cookie in

We kunnen de maximale leeftijd instellen (met een methode maxAge (int)) die bepaalt hoeveel seconden een bepaalde cookie geldig moet zijn voor:

uiColorCookie.setMaxAge (60 * 60); 

We stellen een maximale leeftijd in op één uur. Na deze tijd kan de cookie niet worden gebruikt door een client (browser) bij het verzenden van een verzoek en moet deze ook uit de browsercache worden verwijderd.

2.3. Stel het cookiedomein in

Een andere handige methode in de Koekje API is setDomain (tekenreeks).

Dit stelt ons in staat om domeinnamen te specificeren waaraan het door de klant geleverd moet worden. Het hangt er ook van af of we de domeinnaam expliciet specificeren of niet.

Laten we het domein voor een cookie instellen:

uiColorCookie.setDomain ("example.com");

De cookie wordt afgeleverd bij elk verzoek dat wordt gedaan door example.com en zijn subdomeinen.

Als we een domein niet expliciet specificeren, wordt het ingesteld op de domeinnaamdie een cookie heeft aangemaakt.

Als we bijvoorbeeld een cookie maken van example.com en laat de domeinnaam leeg, dan wordt deze afgeleverd bij het www.example.com (zonder subdomeinen).

Naast een domeinnaam kunnen we ook een pad specificeren. Laten we daar eens naar kijken.

2.4. Stel het cookiepad in

Het pad geeft aan waar een cookie wordt afgeleverd.

Als we expliciet een pad specificeren, dan is een Koekje wordt afgeleverd bij de opgegeven URL en al zijn submappen:

uiColorCookie.setPath ("/ welcomeUser");

Impliciet wordt het ingesteld op de URL die een cookie en al zijn submappen heeft gemaakt.

Laten we ons nu concentreren op hoe we hun waarden kunnen terugvinden in een Servlet.

2.5. Lees cookies in de servlet

Cookies worden door de klant aan het verzoek toegevoegd. De klant controleert zijn parameters en beslist of hij deze naar de huidige URL kan bezorgen.

We kunnen alle cookies krijgen door te bellen getCookies () op verzoek (HttpServletRequest) doorgegeven aan de Servlet.

We kunnen deze array doorlopen en zoeken naar degene die we nodig hebben, bijvoorbeeld door hun namen te vergelijken:

public Optioneel readCookie (String key) {return Arrays.stream (request.getCookies ()) .filter (c -> key.equals (c.getName ())) .map (Cookie :: getValue) .findAny (); }

2.6. Verwijder een cookie

Naarverwijder een cookie uit een browser, we moeten een nieuwe toevoegen aan het antwoord met dezelfde naam, maar met een maxAge waarde ingesteld op 0:

Cookie userNameCookieRemove = nieuwe Cookie ("userName", ""); gebruikersnaamCookieRemove.setMaxAge (0); response.addCookie (userNameCookieRemove);

Een voorbeeld van gebruiksscenario voor het verwijderen van cookies is het uitloggen van de gebruiker - mogelijk moeten we enkele gegevens verwijderen die zijn opgeslagen voor een actieve gebruikerssessie.

Nu weten we hoe we met cookies kunnen omgaan in een Servlet.

Vervolgens behandelen we een ander belangrijk object dat we vaak openen vanuit een Servlet - een Sessie voorwerp.

3. HttpSession Voorwerp

De HttpSession is een andere optie voor het opslaan van gebruikersgerelateerde gegevens over verschillende verzoeken. Een sessie is een opslag aan de serverzijde met contextuele gegevens.

Gegevens worden niet gedeeld tussen verschillende sessie-objecten (de client heeft alleen toegang tot de gegevens van de sessie). Het bevat ook sleutel / waarde-paren, maar in vergelijking met een cookie kan een sessie een object als waarde bevatten. Het opslagimplementatiemechanisme is serverafhankelijk.

Een sessie wordt gematcht met een klant door middel van een cookie of verzoekparameters. Meer info vind je hier.

3.1. Een sessie krijgen

We kunnen een HttpSession rechtstreeks vanuit een verzoek:

HttpSession-sessie = request.getSession (); 

De bovenstaande code maakt een nieuwe sessie aan voor het geval deze niet bestaat. We kunnen hetzelfde bereiken door te bellen naar:

request.getSession (true)

Als we alleen een bestaande sessie willen verkrijgen en geen nieuwe willen maken, moeten we het volgende gebruiken:

request.getSession (false) 

Als we de JSP-pagina voor de eerste keer openen, wordt er standaard een nieuwe sessie aangemaakt. We kunnen dit gedrag uitschakelen door de sessie toe te schrijven aan vals:

In de meeste gevallen gebruikt een webserver cookies voor sessiebeheer. Wanneer een sessieobject wordt aangemaakt, maakt een server een cookie aan met JSESSIONID sleutel en waarde die een sessie identificeert.

3.2. Sessie Attributen

Het sessieobject biedt een aantal methoden voor toegang tot (maken, lezen, wijzigen, verwijderen) attributen die voor een bepaalde gebruikerssessie zijn gemaakt:

  • setAttribute (String, Object) die een sessiekenmerk creëert of vervangt door een sleutel en een nieuwe waarde
  • getAttribute (tekenreeks) die een attribuutwaarde leest met een bepaalde naam (sleutel)
  • removeAttribute (tekenreeks) die een attribuut met een bepaalde naam verwijdert

We kunnen ook eenvoudig reeds bestaande sessieattributen controleren door te bellen getAttributeNames ().

Zoals we al zeiden, konden we een sessieobject uit een verzoek halen. Als we het al hebben, kunnen we de bovengenoemde methoden snel uitvoeren.

We kunnen een attribuut maken:

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

De attribuutwaarde kan worden verkregen door de sleutel (naam):

session.getAttribute ("attributeKey"); 

We kunnen een attribuut verwijderen als we het niet meer nodig hebben:

session.removeAttribute ("attributeKey"); 

Een bekende use-case voor een gebruikerssessie is het ongeldig maken van volledige gegevens die worden opgeslagen wanneer een gebruiker uitlogt van onze website. Het sessieobject biedt hiervoor een oplossing:

session.invalidate (); 

Deze methode verwijdert de hele sessie van de webserver, zodat we er geen toegang meer toe hebben.

HttpSession object heeft meer methoden, maar degene die we noemden zijn de meest voorkomende.

4. Conclusie

In dit artikel hebben we twee mechanismen behandeld waarmee we gebruikersgegevens kunnen opslaan tussen opeenvolgende verzoeken aan de server: de cookie en de sessie.

Houd er rekening mee dat het HTTP-protocol staatloos is en dat het handhaven van de status van alle verzoeken daarom een ​​must is.

Zoals altijd zijn codefragmenten beschikbaar op Github.