web-dev-qa-db-fra.com

Qu'est-ce que la session en Java?

Jusqu'à présent, je comprends les concepts de Httpsession en Java.

 HttpSession ses = req.getSession(true);

créera un objet de session, selon la demande.

setAttribute("String", object);

will, liera la "chaîne" et la valeur à l'objet Session.

getAttribute("String");

renverra un objet associé à la chaîne spécifiée.

Ce que je ne peux pas comprendre, c'est: je crée un objet de session comme HttpSession ses = req.getSession(true); et je lui attribue un nom en appelant setAttribute("String", object);. Ici, ce code réside à l'intérieur du serveur. Pour chaque personne, lorsqu'il essaie de se connecter, le même code sur le serveur sera exécuté. setAttribute("String", object); dans cette méthode, la valeur de chaîne est constante. Ainsi, chaque objet de session créé sera lié par la même chaîne que celle que j'ai fournie. Lorsque j'essaie de récupérer la chaîne pour valider sa session ou lorsque l'action de déconnexion a pris la getAttribute("String"); ll retourne la même valeur de chaîne constante (ai-je raison !! ?? En fait, je ne sais pas, je suis juste en pensant à sa logique d'exécution). Ensuite, comment puis-je invalider.

J'ai vu ce type d'illustration dans tous les tutoriels sur le WEB. Est-ce la manière réelle de définir cet attribut? Ou, les vrais développeurs d'applications donneront une variable dans le champ "String" pour la définir dynamiquement

(ie. session.setAttribut(userName, userName); //Setting the String Dynamically.. I dono is it right or not.)

Et ma dernière question est

WebContext ctx = WebContextFactory.get();
request = ctx.getHttpServletRequest();

Que font les deux lignes ci-dessus? Qu'est-ce qui sera stocké dans ctx & request? HttpSession ses = req.getSession(true); créera de nouveaux moyens de session. Quelle valeur stockée dans ses.

14
user405398

Quelques précisions [aléatoires]:

  1. Vous n'avez pas besoin de mécanismes de connexion/déconnexion pour avoir des sessions.
  2. Dans les Java, les sessions HTTP sont suivies à l'aide de deux mécanismes, le cookie HTTP (le plus couramment utilisé) ou la réécriture d'URL (pour prendre en charge les navigateurs sans cookies ou avec les cookies désactivés). L'utilisation de cookies uniquement est simple, vous n'avez rien à faire de spécial. Pour la réécriture d'URL, vous devez modifier toutes les URL pointant vers vos servlets/filtres.
  3. Chaque fois que vous appelez request.getSession(true), l'objet HttpRequest sera inspecté afin de trouver un ID de session encodé soit dans un cookie OU/ET dans le paramètre de chemin URL (ce qui suit un point-virgule ). Si l'ID de session est introuvable, une nouvelle session sera créée par le conteneur de servlet (c'est-à-dire le serveur).
  4. L'ID de session est ajouté à la réponse en tant que cookie. Si vous souhaitez également prendre en charge la réécriture d'URL, les liens dans vos documents HTML doivent être modifiés à l'aide de la méthode response.encodeURL(). L'appel de request.getSession(false) ou simplement request.getSession() renverra null si l'ID de session n'est pas trouvé ou si l'ID de session fait référence à une session non valide.
  5. Il y a une seule session HTTP par visite, car Java ne sont pas stockés en permanence dans le navigateur. Ainsi, les objets sessions ne sont pas partagés entre les clients. Chaque utilisateur a son propre session privée.
  6. Les sessions sont détruites automatiquement si elles ne sont pas utilisées pendant un temps donné. La valeur du délai d'attente peut être configurée dans le fichier web.xml.
  7. Une session donnée peut être explicitement invalidée à l'aide de la méthode invalidate().
  8. Lorsque les gens parlent de JSESSIONID, ils font référence au nom standard du cookie HTTP utilisé pour effectuer le suivi de session en Java.
19
gawi

Je vous suggère de lire un tutoriel sur Java. Chaque utilisateur obtient un objet HttpSession différent, basé sur un paramètre de demande/réponse JSESSIONID que le Java le serveur Web envoie au navigateur. Ainsi, chaque utilisateur peut avoir un attribut du même nom et la valeur stockée pour cet attribut sera différente pour tous les utilisateurs.

En outre, WebContextFactory et WebContext sont des classes DWR qui fournissent un moyen simple d'obtenir les paramètres de servlet.

13
Kaleb Brasee

Si je comprends bien, vos préoccupations concernent la séparation des différents utilisateurs lors du stockage des éléments dans la session HttpSession.

Le conteneur de servlet (par exemple Tomcat) s'en charge en utilisant son JSESSIONID.

L'histoire se passe ainsi:

  1. L'utilisateur se connecte d'abord au site Web.
  2. Le conteneur de servlet définit un COOKIE sur le navigateur de l'utilisateur, stockant un jsessionId UNIQUE.
  3. Chaque fois que l'utilisateur accède au site Web, le cookie JSESSIONID est renvoyé.
  4. Le conteneur de servlet l'utilise pour garder une trace de qui est qui.
  5. De même, c'est ainsi qu'il garde la trace de la séparation des données. Chaque utilisateur possède son propre ensemble d'objets identifiés de manière unique par le JSESSIONID.

J'espère que cela répond (au moins partiellement) à votre question.

À votre santé

9
lucas1000001

Votre servlet de base va ressembler

public class MyServlet{

public doGet(HttpServletRequest req, HttpServletResponse res){
//Parameter true: 
//    create session if one does not exist. session should never be null 
//Parameter false: 
//    return null if there is no session, used on pages where you want to 
//    force a user to already have a session or be logged in
//only need to use one of the two getSession() options here. 
//Just showing both for this test
HttpSession sess = req.getSession(true);
HttpSession sess2 = req.getSession(false); 

//set an Attribute in the request. This can be used to pass new values
//to a forward or to a JSP
req.setAttribute("myVar", "Hello World");
}

}

Il n'est pas nécessaire de définir des noms d'attributs pour votre session qui sont déjà terminés. Comme d'autres l'ont suggéré dans d'autres réponses, utilisez des cookies ou une réécriture d'URL pour stocker l'ID de session pour vous.

Lorsque vous traitez avec le DWR WebContext, il fait simplement la même chose que ci-dessus, juste normalement l'objet Request n'est pas passé dans la méthode, vous utilisez donc le WebContext pour obtenir cette demande pour vous

public class DWRClass {
 public doSomething(){
WebContext ctx = WebContextFactory.get();
HttpServletRequest req = ctx.getHttpServletRequest();
HttpSession sess = req.getSession(); //no parameter is the same as passing true

//Lets set another attribute for a forward or JSP to use
ArrayList<Boolean> flags = new ArrayList<Boolean>();
req.setAttribute("listOfNames", flags);
}
}
3
Sean