Toon posts:

[java] httpsession

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo.

Ik heb een HTTPSession object waarin ik een aantal gegevens bewaar. Nu wil ik op het moment dat de session een time out geeft een bepaalde actie ondernemen. Weet iemand hoe ik het voor elkaar kan krijgen dat wanneer de session verloopt ik een bepaalde methode kan uitvoeren. Dus wanneer de HTTPSession.finalize() wordt aangesproken.

Verwijderd

Na enig speuren in mijn boeken, bleek de finalize helemaal niet te bestaan. Het klinkt dus heel leuk, maar het bestaat niet. Zelfs Sun kent het niet. Maar nu even een goed antwoord geven.

Indien je zelf een sessie wilt afsluiten, doordat een gebruiker aan het hacken geslagen is of zo, gebruik je session.invalidate(); via HttpSession session = request.getSession(true); maak je weer een nieuwe aan.

Maar waarschijnlijk wil je het volgende weten! De HttpSessionBindingListener interface zorgt voor de notificatie als een object aan een sessie wordt gebonden of wordt ontbonden (hetgeen het geval is als de sessie eindigd). Door deze interface te implementeren krijg je in je object 2 extra methodes:
public void valueBound (HttpSessionBindingEvent event) ;
public void valueUnbound (HttpSessionBindingEvent event) ;

een voorbeeld: voorBeeld.java

import javax.servlet.http.*;

public class voorBeeld implements HttpSessionBindingListener {

//globale variabelen

public voorBeeld() {
//Doe wat nodig is bij opstarten
}

public synchronized void valueBound (HttpSessionBindingEvent event) {
//doe maar wat als het object aangeroepen wordt door de sessie
}

public synchronized void valueUnbound (HttpSessionBindingEvent event) {
//Hier mogen de opruimwerkzaamheden plaatsvinden
}

//de rest van de functies die je wil toevoegen

}

Zo zie je dat de beeindiging van de sessie niet door de sessie wordt afgehandeld maar door het object. Wel geeft de sessie dit automatisch door bij het aanroepen en afsluiten van de sessie.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

[nohtml]
Verwijderd schreef op 24 January 2003 @ 00:23:
Na enig speuren in mijn boeken, bleek de finalize helemaal niet te bestaan. Het klinkt dus heel leuk, maar het bestaat niet. Zelfs Sun kent het niet. Maar nu even een goed antwoord geven.
Niet :?
http://java.sun.com/docs/.../execution.doc.html#44748
Wat is dat dan? :)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)

Idd, aangezien finalize() uit Object komt, lijkt het me sterk als de HTTPSession class geen finalize() kent. Finalize wordt door de JVM aangeroepen als de GC het object komt opruimen, en lijkt zozeer op een destructor, ware het niet dat finalize() het object ook kan redden van destructie door bijv een valid ref te crëeren( echter altijd maar 1x )
Hoe je ervoor kan zorgen dat bij finalize() een methode wordt aangeroepen? Aangezien finalize() in object feitelijk een abstracte methode is (geen body, lege body) maar voor simpelheid niet abstract declared is (leeg voldoet voor bijna alle classes) lijkt het met simpel een kwestie van HTTPSession extenden en finalize() implementeren.
Hier kom je waarsch wel in het probleem dat standaardmethodes een default HTTPSession returnen. Dit zou je opzich kunnen opvangen met een soort convert-constructor, maar maakt het er allemaal niet mooier op.

Verwijderd

Topicstarter
Verwijderd schreef op 24 januari 2003 @ 00:23:
Na enig speuren in mijn boeken, bleek de finalize helemaal niet te bestaan. Het klinkt dus heel leuk, maar het bestaat niet. Zelfs Sun kent het niet. Maar nu even een goed antwoord geven.

Indien je zelf een sessie wilt afsluiten, doordat een gebruiker aan het hacken geslagen is of zo, gebruik je session.invalidate(); via HttpSession session = request.getSession(true); maak je weer een nieuwe aan.

Maar waarschijnlijk wil je het volgende weten! De HttpSessionBindingListener interface zorgt voor de notificatie als een object aan een sessie wordt gebonden of wordt ontbonden (hetgeen het geval is als de sessie eindigd). Door deze interface te implementeren krijg je in je object 2 extra methodes:
public void valueBound (HttpSessionBindingEvent event) ;
public void valueUnbound (HttpSessionBindingEvent event) ;

een voorbeeld: voorBeeld.java

import javax.servlet.http.*;

public class voorBeeld implements HttpSessionBindingListener {

//globale variabelen

public voorBeeld() {
//Doe wat nodig is bij opstarten
}

public synchronized void valueBound (HttpSessionBindingEvent event) {
//doe maar wat als het object aangeroepen wordt door de sessie
}

public synchronized void valueUnbound (HttpSessionBindingEvent event) {
//Hier mogen de opruimwerkzaamheden plaatsvinden
}

//de rest van de functies die je wil toevoegen

}

Zo zie je dat de beeindiging van de sessie niet door de sessie wordt afgehandeld maar door het object. Wel geeft de sessie dit automatisch door bij het aanroepen en afsluiten van de sessie.
Bedankt ik zal het eens proberen..

Verwijderd

Topicstarter
Het werkt inderdaad met de HTTPSessionBindingListener!!

thx

Verwijderd

Glimi schreef op 24 January 2003 @ 10:10:

[...]

Idd, aangezien finalize() uit Object komt, lijkt het me sterk als de HTTPSession class geen finalize() kent. Finalize wordt door de JVM aangeroepen als de GC het object komt opruimen, en lijkt zozeer op een destructor, ware het niet dat finalize() het object ook kan redden van destructie door bijv een valid ref te crëeren( echter altijd maar 1x ).
Om even terug te komen op dit mooie verhaal.
HttpSession is geen object maar een interface. Ik heb dus gezocht op de interface en deze heeft geen finalize functie. De topicstarter had beter aan kunnen geven dat hij een object had die de HttpSession interface implementeerde dan was het duidelijker.
Maar waar maken we ons druk om het probleem is opgelost :)

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 09-01 18:51
Ben op dit moment theoretisch aan het programmeren (oh, wat een ramp als niks ff kan proberen). Nu vroeg ik me alleen af hoe "public class voorBeeld" precies werkt. Als ik bij elke servlet wil controleren of een sessie wordt afgesloten, moet ik dan bij elke servlet voorBeeld aanroepen? En is het nog mogelijk om de waarde uit een sessie te halen in valueUnbound?

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Liqued schreef op 27 januari 2003 @ 14:07:
Ben op dit moment theoretisch aan het programmeren (oh, wat een ramp als niks ff kan proberen). Nu vroeg ik me alleen af hoe "public class voorBeeld" precies werkt. Als ik bij elke servlet wil controleren of een sessie wordt afgesloten, moet ik dan bij elke servlet voorBeeld aanroepen? En is het nog mogelijk om de waarde uit een sessie te halen in valueUnbound?
<Disclaimer: ik heb hier nog nooit op deze manier mee gewerkt, dus misschien blaat ik nu een hoop onzin/>

Waarom zou je in een servlet willen controleren of de sessie afgelsoten is? Een servlet wordt aangeroepen op het moment dat er een HTTP GET/POST binnen komt die verwijst naar je servlet. Op dat moment zorgt de web-container er voor dat jouw servlet die aanroep binnenkrijgt zodat je servlet kan reageren.

Een sessie die wordt afgesloten is iets dat binnen de container gebeurt, de gebruiker heeft er geen directe invloed op. Er zijn dus geen HTTP requests die door je servlet kunnen worden afgehandeld. Kortom, je servlet krijgt geen seintje op het moment dat er een sessie verdwijnt.

Of je nog waardes uit een HttpSession kunt lezen als de sessie wordt afgsloten, geen idee. Probeer het en deel je ervaringen hier...

With the light in our eyes, it's hard to see.


Verwijderd

Topicstarter
Liqued schreef op 27 januari 2003 @ 14:07:
Ben op dit moment theoretisch aan het programmeren (oh, wat een ramp als niks ff kan proberen). Nu vroeg ik me alleen af hoe "public class voorBeeld" precies werkt. Als ik bij elke servlet wil controleren of een sessie wordt afgesloten, moet ik dan bij elke servlet voorBeeld aanroepen? En is het nog mogelijk om de waarde uit een sessie te halen in valueUnbound?
Ik gebruik het als volgt: Ik ben met een bepaalde applicatie bezig waarbij ik statistieken moet bij houden van het aantal activiteiten van een gebruiker. Op het moment dat een gebruiker inlogt maak ik een gebruiker object aan (gewoon een beantje met getters en setters op gebruiker gegevens). Dit object stop ik in de HTTPSession met request.getSession.setAttribute().

Op het moment dat de gebruiker niet meer actief is en de sessie dus verloopt moeten de statistieken naar een db geschreven worden. Ik doe dit door in de gebruiker klasse een inner class te maken die de HTTPSessionBindingListener implementeerd. Als het object gebruiker nu ontbonden wordt van de Session (dus als de session out timed) geeft ie een seintje aan de httpSessionBindinglistener waarop de ValueUnbound wordt aangesproken. In deze method stop ik dus de acties om de statistieken weg we schrijven. Dus dit gebeurt vlak voor de sessie daadwerkelijk op houdt te bestaan.

[ Voor 5% gewijzigd door Verwijderd op 28-01-2003 20:08 ]

Pagina: 1