# Java > Dveloppement Web en Java > Servlets/JSP >  Dtruire proprement la session et les variables existantes

## hpl76

Bonjour, 

Je dbute en JSP et voulais savoir comment dtruire proprement une session.

Ci-dessous la faon dont je l'initialise (aprs la requte)

```

```

Je passe ma session de page en page grce 

```
<jsp:useBean id="user" class="java.util.ArrayList" scope="session" />
```

Dernier point, comment tester si une session existe ?

Merci d'avance pour votre aide.

----------


## slevy

Je ne vois pas o tu mets ton ArrayList en session (dans ta servlet).

Il faut faire :



```

```

Le fait de passer la valeur _true_ _getSession(true)_ veut dire que si la session n'existe pas, alors elle est cr.

Le mieux c'est de laisser la session expirer toute seule mais si tu veux la dtruire tu peux faire :


```

```

----------


## hpl76

Houla ca se corse pour moi ^^

Je veux pouvoir dtruire la session comme quand on clique sur "Dconnexion".
Mon application doit pouvoir permettre  un utilisateur de s'authentifier sous diffrents noms pour avoir diffrents droits. Tu me suis ?

hpl76

----------


## slevy

Oui c'est a, dans la servlet deconnexion tu fais :



```

```

----------


## OButterlin

Pour tester si une session n'existe pas, il faut faire


```

```

Si tu fais request.getSession(true), tu demandes "donne moi la session courante et si elle n'existe pas, cr la"

----------


## hpl76

Tu m'as devanc ^^

C'est cool de tomber sur des gens comme toi. Perso ca m'encourage  vouloir apprendre. En revanche moi j'avais ceci :



```

```

Le truc c'est que ca marche en partie. Je m'explique, ma session est  demi-morte. Quand je vais sur une page que j'ai dj visit malgr la destruction de ma session, j'y ai quand mme accs malgr le check user.isEmpty, bizarre non ? Comme ci la page tait gard dans le cache (en fait c'est quasi le cas)

Une ide ?

Amicalement,

hpl76

Ps : je vais essayer avec ton code galement merci

----------


## T`lash

Petit  propos au passage : vite  tout prix d'utiliser la classe Vector qui est un reliquat des premires versions du langage et qui pourrait disparaitre du jour au lendemain (mme si en gnral les classes dprcies restent l  alourdir le JRE).
Utilise plutt ArrayList ou autre selon le cas.

----------


## OButterlin

Pour "annuler" une session, c'est effectivement session.invalidate() qui rpond au besoin.

Dans certains cas, si par exemple tu testes systmatiquement ( chaque request) la prsence d'un objet particulier (comme par exemple "user"), tu pourrais te contenter de retirer cet objet de la session par session.remove("user");

A+

----------


## OButterlin

> ...
> Le truc c'est que ca marche en partie. Je m'explique, ma session est  demi-morte. Quand je vais sur une page que j'ai dj visit malgr la destruction de ma session, j'y ai quand mme accs malgr le check user.isEmpty, bizarre non ? Comme ci la page tait gard dans le cache (en fait c'est quasi le cas)
> 
> Une ide ?


Alors, c'est tout  fait normal.
Il y a une petite subtilit dans le tag <jsp:useBean> :

Si tu utilises l'attribut "class=", le fonctionnement n'est pas identique  l'attribut "type=".
Dans le premier cas, si la classe n'existe pas dans le scope, il la cr et la met dans le scope voulu.
Dans le deuxime cas, si elle n'existe pas dans le scope, il renvoie NULL

Le cas 1 implique galement un constructeur sans argument (obligatoire)

----------


## hpl76

Excusez-moi, je ne maitrise pas tous les termes comme scope...ces choses me sont encore peu familires, j'y vais  tton...

Dans mon cas et dans tous les cas de sites web, quelle est la meilleure scurit possible pour pallier au problme  de faon  ce que la session soit morte  l'appel de la fonction session.invalidate();

car si je suis un p'tit malin aprs la dconnexion je retappe l'url d'o je viens et j'accde aux infos :\

----------


## OButterlin

Le "scope" correspond  la zone dans laquelle tu stockes l'information.
Il y en a 4 courantes :
- request (uniquement accessible le temps de la requte)
- session (accessible tant que la session est valide)
- application (accessible tant que l'application est active et quelque soit le "client")
- page (accessible uniquement  l'intrieur de la page)

Le plus sr pour "flinguer" la session est session.invalidate().
Tout ce qui existait dedans sera dtruit

----------


## hpl76

Merci encore pour ce complment  :;): 

Je dois mal saisir quelque chose, le truc c'est que je dtruis bien avec :
session.invalidate();

ma page deco.jsp qui est joue au clic sur le lien dconnexion en page2.jsp.



```

```

Tout est ok ( priori). Pour tester la scurit, je rappelle la page2.jsp et oh surprise elle s'affiche !!! 

Le dbut de cette page :



```

```

En revanche  la moindre action sur cette page, je reviens bien au pav de login.

Sinon autre chose, ces syntaxes sont bonnes ? Mmes rsultats ?


```

```

hpl76 qui tient le bon bout (enfin j'crois  ::): )

----------


## OButterlin

a ressemble  une page en cache dans le navigateur...
Quand tu dis "je rappelle la page page2.jsp" tu la rappelles comment au juste ?
- un back dans le navigateur ?
- autre cas ?

Pour a



> Sinon autre chose, ces syntaxes sont bonnes ? Mmes rsultats ?
> 
> 
> ```
> 
> ```


j'ai du mal  suivre ce que a fait, mais il est clair que ce n'est pas la mme chose puisque ton premier test (valu en premier) est le contraire de celui de la v2

----------


## hpl76

1 - 


> a ressemble  une page en cache dans le navigateur...
> Quand tu dis "je rappelle la page page2.jsp" tu la rappelles comment au juste ?
> - un back dans le navigateur ?
> - autre cas ?


Je regarde dans l'historique url ou je place mon curseur dans la barre d'url et je saisis le nom, l'url de la page source.

Dsol pour tout ce cas particulier, c'est tout moi  ::aie:: 

2 - Je dois l'interprter comment cela : 



```
if (request.getSession(false) != null ) {
```

J'essaie de trouver le moyen de dire : "si variable session user existe alors"...

----------


## OButterlin

C'est sr que par l'historique, tu retrouveras toujours ta page, mais l'essentiel est que tu ne puisse rien en faire  :;):

----------


## hpl76

Merci mais...

1 - si ma variable de session user est dtruite comment se fait il que le systme me raffiche bonjour hpl76, dconnectez-vous ? C'est le cas malgr le passage par destroy et malgr le check en haut de page :'(

2 - Je dois l'interprter comment cela : 



```
if (request.getSession(false) != null ) {
```

J'essaie dsespremment de trouver le moyen de dire : "si variable session user existe alors"...je commence  fatiguer lol.

----------


## OButterlin

Essaye plutt cette forme


```

```

Aprs un session.invalidate(), tu seras dans le cas user == null

Maintenant, tu pourrais galement passer par un filtre pour faire ce test plutt que de le mettre dans toutes tes pages.
(mais on verra a plus tard peut-tre  :;): )

----------


## hpl76

Bonjour, 

Dsol de ne donner que des news maintenant mais j'tais en dplacement  ::P: .

Bon j'ai essay ton autre solution et sans me provoquer un message d'erreur, l'affichage de ma page s'arrte en cours.

C'est dsesprant  ::(: 

Je viens de m'appercevoir d'une faille "peut tre". Si dans mes options Internet > onglet gnral > fichiers temporaires > paramtres je mets sur " chaque visite de la page" le script de session fonctionne en revanche si je laisse sur "automatique", mme si la session est tue, il garde en mmoire ma page et la session qui tait affecte puisqu'il me raffiche bonjour hpl76 (logu donc) au lieu de bonjour internaute. Zarb, non ? Quelqu'un connait le truc ? Ca fait pareil avec les boutons prcdents/suivants...On dirait que la session ne meurt pas sur le coup lol

----------


## Desboys

Bonjour,

ton navigateur a stock temporairement la page gnre. Si tu veux obliger  recharger une page gnre dynamiquement, il vaut mieux s'intresser au header HTTP cache-control.

Cordialement,

----------


## OButterlin

> ...
> On dirait que la session ne meurt pas sur le coup lol
> ...


Je te rassure, aprs un session.invalidate(), la session est "morte"  :;): 
Par contre, elle peut se recrer  vitesse grand V si par exemple dans ton code tu as un request.getSession() ==> nouvelle session immdiatement !

Par contre, le cas que tu soulves est typique du cache du navigateur et de ce ct, IE avait de curieux comportement en version 4, 5 mais plus  partir de la 6 (de mmoire  ::aie:: )
Mme avec le pragma no-cache on pouvait avoir des surprises (il faisait un peu ce qu'il veut).
Comme le dit Desboys, tu peux dj essayer la ribambelle d'attributs


```

```

et tester  nouveau...

----------


## hpl76

Bonjour, 

Merci de votre soutien et votre patience.

Je connais bien en effet les attributs dont tu parles mais je ne pensais pas devoir en arriver l (PHP pour le coup n'a pas ce problme). Si j'attaque les dites pages via l'url ca fonctionne maintenant, je suis renvoy  la page de login en revanche on peut rien faire contre les boutons suivant / prcdent car eux provoquent encore la tuile.

Ca devient bon. 

hpl76 reconnaissant  ::D:

----------


## OButterlin

C'est clair, contre un back du navigateur, on ne peut pas grand chose...

Maintenant, il faut bien reconnaitre que ce n'est pas trs gnant non plus puisqu'on peut facilement interdire toute opration quand la session est dtruite (par un filtre par exemple, a centralise tous ces tests)

A+

----------


## nicorama

Salut,
Je vais mettre de l'huile sur le feu, mais pourquoi utilise-tu une session ?

Si ce n'est que pour garder l'utilisateur en mmoire, il y a bien d'autres moyens plus srs (pas de risque d'avoir user==null quelque part), qui permettent de rendre ton appli plus facilement dveloppable sur le moyen terme.

----------


## OButterlin

> Salut,
> Je vais mettre de l'huile sur le feu, mais pourquoi utilise-tu une session ?
> 
> Si ce n'est que pour garder l'utilisateur en mmoire, il y a bien d'autres moyens plus srs (pas de risque d'avoir user==null quelque part), qui permettent de rendre ton appli plus facilement dveloppable sur le moyen terme.


Certes... L'authentification du serveur est plus intressante de ce point de vue... Mais bon, l n'est pas sa question...  :;):

----------


## BradPitt

> Salut,
> Je vais mettre de l'huile sur le feu, mais pourquoi utilise-tu une session ?
> 
> Si ce n'est que pour garder l'utilisateur en mmoire, il y a bien d'autres moyens plus srs (pas de risque d'avoir user==null quelque part), qui permettent de rendre ton appli plus facilement dveloppable sur le moyen terme.


Bonjour,

Quel serait vos suggestions? J'essaie d'viter l'utilisation d'une variable de session pour le username.

Merci! ::pc::

----------


## nicorama

Pour ma part, les requtes du user envoient  chaque fois un cookie ou un header Authorization.
La JSP rcupre ces valeurs via un tag. La JSP envoie ces valeurs dans un bean charg lui de valider l'utilisateur, et ses droits vis  vis de ce que fera cette requte.

A chaque reqete, je cre donc l'objet User. Tu peux en savoir un peu plus sur mon tutoriel Restful & JSP

----------


## OButterlin

Tu peux utiliser l'authentification du serveur galement, que ce soit par JAAS ou autre...

----------


## nicorama

Mouais. Jamais t chaud par l'authentification serveur. Il faut dire que je suis cens pouvoir authentifier des milliers de gens ayant des roles trs diffrents. 

J'aime autant avoir le controle personnel sur ce qui se passe. En termes de transit des donnes et de puissance de calcul.

Bon, je suppose que beaucoup de technos font ca mieux que moi, mais sont-elles perennent ? Voila qui largit le thread  ::):

----------

