[ djura1 @ 17.02.2004. 10:10 ] @
Zdravo svima.
Pokusavam da napravim aplikaciju koja se sastoji od nekoliko servleta i hteo bih da primenim neku vrstu session trackinga. Sad, zadnjih nekoliko dana sam proveo na webu trazeci primere i uputstva i neke stvari mi nisu bas jasne. Na primer, kako sesije dele izmedju servleta?

Konkretno, kada se korisnik uloguje, poziva se LoginServlet i on kreira HttpSession objekat. Kako da tom objektu pristupim iz drugog servleta? Da li moram da ga sacuvam negde ili kontejner to radi automatski? Ako neko ima neki primer, bio bih veoma zahvalan.
Jos jedno pitanje: ako se koristi HttpSession objekat, da li moram da vodim racuna o cookie-ima, prepisivanju URL-a ili se to takodje radi automatski?
[ StMilan @ 17.02.2004. 11:35 ] @
Vidi ovo:
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets11.html

[ weB_KiLeR @ 17.02.2004. 12:20 ] @
To je veoma prosta stvar ako neces da citas svu onu dokumentaciju evo ti kako to radi.
Ja sam to ovako radio imao sam jedan servlet u kojem on izvuce user i pass od usera proveri u mysql-u da li je ok i dalje radi ovo:
(samo prvo napravis session HttpSession session = request.getSession(true); )
Code:

    session.setAttribute("Username", user);//stavljas atribut za user
    session.setAttribute("RANK", String.valueOf(rank));//atribut za rank
    response.sendRedirect("members.jsp?ssid=" + sessionID);//i vadis session id


To je to , posle sam to prosledio jsp-u
Code:

String ssid = request.getParameter("ssid");//ovde uzima taj ssid koji mu posaljes
String sessionID = session.getId(); // ovde vadi taj sessionid
 if ( ssid.equals(sessionID) )
     {
     String Username = session.getAttribute("Username").toString();// ovde vadi user
     String RANK    = session.getAttribute("RANK").toString();//a ovde vadi rank
        } else bla bla bla


Znaci udaris mu atribut i izvadis sessionID i samo proveravas na svakoj stranici mada mozes i bean da napravis za proveru...
To je sve dosta prosto tako da ono ;)
[ djura1 @ 17.02.2004. 13:55 ] @
Znaci, ako sam dobro razumeo, u svaki link koji se pojavljuje na mojoj JSP strani treba da ubacim "?sesion=sessionID"? I svaki put kad korisnik poseti taj link iz requesta izvucem sesionID. Ovo mi izgleda mnogo lakse od onih primera sa prepisivanjem URL-a. Hvala na pirmeru.

P.S.
Citat:

Code:

session.setAttribute("Username", user);//stavljas atribut za user
    session.setAttribute("RANK", String.valueOf(rank));//atribut za rank
    response.sendRedirect("members.jsp?ssid=" + sessionID);// i vadis session id



Ovde valjda treba da bude
Code:

response.sendRedirect("members.jsp?ssid="+session.getID());

Zar ne?
[ sspasic @ 17.02.2004. 15:00 ] @
Ufff... mislim da si zakomplikovao bez potrebe.

Session ID se prenosi na jedan od dva nacina:
1. Pomocu cookies
2. Pomocu stringa ;jsessionid=... koji se doda na kraj linka u URL-u

Prvi nacin radi automatski a kod drugog url-ove samo treba formirati pomocu encodeUrl. Po svemu ostalom oba nacina su ekvivalentna, a mozes i da ih kombinujes ako ti tako nesto bas zatreba.
Ovaj drugi nacin postoji jednostavno zbog toga sto postoje browseri koji ne rade sa kukijima a ima i ljudi koji tu mogucnost browsera iskljucuju.

Sesija i atributi sesije koje postavis u jednom servletu vidljivi su i u ostalim servletima iste web aplikacije.

Ovaj kod mi nije jasan:
Citat:
weB_KiLeR:
Code:

String ssid = request.getParameter("ssid");//ovde uzima taj ssid koji mu posaljes
String sessionID = session.getId(); // ovde vadi taj sessionid
 if ( ssid.equals(sessionID) )
     {
     String Username = session.getAttribute("Username").toString();// ovde vadi user
     String RANK    = session.getAttribute("RANK").toString();//a ovde vadi rank
        } else bla bla bla



Ovaj kod ce da radi samo ako se sessionID prenese na jedan od ova dva nacina, pa je prenos ssid nepotreban. Jer, kako ono ssid.equals(...) moze da bude true ako sessionid nije vec prenesen?
Ili gresim?
[ tweeester @ 17.02.2004. 15:13 ] @
hm, da, sve je zakomplikovano do krajnjih granica :)

Stvarno nema potrebe da brines o session tracking-u, to je duznos servlet container-a. Tvoje je da u jednom servletu kazes:

Code:

session.setAttribute("ime","vrednost");



a pola sata kasnije u nekom drugom servletu mozes da kazes:

Code:

String value=session.getAttribute("ime");
...<iskoristi ime za nesto pametno>


[ weB_KiLeR @ 17.02.2004. 16:57 ] @
Citat:
sspasic:

Ovaj kod mi nije jasan:
Citat:
weB_KiLeR:
Code:

String ssid = request.getParameter("ssid");//ovde uzima taj ssid koji mu posaljes
String sessionID = session.getId(); // ovde vadi taj sessionid
 if ( ssid.equals(sessionID) )
     {
     String Username = session.getAttribute("Username").toString();// ovde vadi user
     String RANK    = session.getAttribute("RANK").toString();//a ovde vadi rank
        } else bla bla bla



Ovaj kod ce da radi samo ako se sessionID prenese na jedan od ova dva nacina, pa je prenos ssid nepotreban. Jer, kako ono ssid.equals(...) moze da bude true ako sessionid nije vec prenesen?
Ili gresim?


Ma dobro to je iz mog nekog koda :P uglavnom radi se o tome da on kad proveri username i pass taj session mora da bude isti kao i session sa tih stranica kako bi se videlo da li je to taj korisnik kapiras :)
(sve je malo komplikovanije ali ono)
[ djura1 @ 17.02.2004. 19:26 ] @
OK, imam problem. U jednom servletu imam
Code:

HttpSession session=request.getSession(true);
session.setAttribute("user", userName);
.....................................
out.println("<a href=\"ShowTableServlet>ShowTable</a>"); 
 out.println(" session ID: "+session.getId());


A u drugom
Code:

out.println("session ID: "+request.getSession().getId());
out.println("user name: "+(String)request.getSession().getAttribute("user"));


Ali u drugom servletu dobijem potpuno drugaciji session ID, a userName je null. Gde gresim?
[ dejankr @ 18.02.2004. 08:09 ] @
Citat:
djura1:
OK, imam problem. U jednom servletu imam
Code:

HttpSession session=request.getSession(true);
session.setAttribute("user", userName);
.....................................
out.println("<a href=\"ShowTableServlet>ShowTable</a>"); 
 out.println(" session ID: "+session.getId());


A u drugom
Code:

out.println("session ID: "+request.getSession().getId());
out.println("user name: "+(String)request.getSession().getAttribute("user"));


Ali u drugom servletu dobijem potpuno drugaciji session ID, a userName je null. Gde gresim?


Vodi računa da oba servleta treba da ti budu deo iste web aplikacije. Dalje, bitno je i kako pozivaš ova dva servleta. Ukoliko su na primer u pitanju različiti browseri, to su za servlet kontejner dva različita korisinika. Čak i ako koristiš dva ista browera, ima razlike da li si ih pokrenuo odvojeno ili si pokrenuo prvo jedan, pa drugi dobio iz prvog preko New -> Window (ko IE). Probaj da sve pozivaš iz istog prozora.

Proveri da li su ti cookiji enablovani. Nisi ovde pokazao kako te jedan servlet baca na drugi, ali ako su ti disablovani cookiji onda bi trebalo da koristiš encodeURL metodu. U stvari, response.encodeURL() možeš koristiti bez obzira da li se koriste cookiji ili url rewriting, pošto će ti u prvom slučaju vratiti neizmenjen URL.

Takođe, bitno je i koliko vremena prođe između poziva ova dva servleta, jer sesije imaju određeno vreme koliko su validne. Mislim da je to po defaultu 30 minuta, ali se može menjati u web.xml-u.
[ djura1 @ 18.02.2004. 08:59 ] @
Ovako: servleti su deo iste aplikacije, pozivam ih iz istog prozora browsera, jedan za drugim.
U stvari, prvi servlet (gde pravim HttpSession objekat)generise link ka drugom servletu
Code:

out.println("<a href=\"ShowTableServlet\">ShowTable</a>");

Ovde je ShowTableServlet drugi servlet u kome proveravam sessionID i username.

Sto se tice encodeURL(), mislio sam da ako koristim HttpSession, servlet kontejner to radi automatski?
[ dejankr @ 18.02.2004. 10:28 ] @
Citat:
djura1:
Ovako: servleti su deo iste aplikacije, pozivam ih iz istog prozora browsera, jedan za drugim.
U stvari, prvi servlet (gde pravim HttpSession objekat)generise link ka drugom servletu
Code:

out.println("<a href=\"ShowTableServlet\">ShowTable</a>");

Ovde je ShowTableServlet drugi servlet u kome proveravam sessionID i username.

Sto se tice encodeURL(), mislio sam da ako koristim HttpSession, servlet kontejner to radi automatski?


Ne radi autmatski. Da bi bio siguran da će session tracking raditi na svim browserima, za svaki link ka svom sajtu trebalo bi da bude pozvan encodeURL. Ovaj metod će u zavisnosti od toga da li korisnik koristi cookije ili ne, ostaviti tvoj url isti ili će dodati sessionID parametar koji kontejneru služi da pronađe odgovarajući session objekat i isti pridruži requestu tako da ga ti možeš koristiti u svom kodu bez potrebe da sam programiraš session tracking kod.
Nisi rekao da li su ti cookiji omogućeni. Jer ako jesu, onda verovatno nije problem ni do encodeURL metode.

Dejan
[ sspasic @ 18.02.2004. 11:03 ] @
Citat:
djura1:
Ovako: servleti su deo iste aplikacije, pozivam ih iz istog prozora browsera, jedan za drugim.

Koji kontejner za web aplikacije koristis?
Da nije u njemu iskljuceno koriscenje kukija? To je parametar cookies u context elementu XML konfiguracionog fajla.
[ djura1 @ 18.02.2004. 12:17 ] @
Bili ste u pravu za kukije. Ali sad ima druga stvar: naime, prvi put je uspeo da prepozna i sessionID i usera, ali kad god se ponovo ulogujem kao drugi user, prikaze se ID i ime prvog usera. Pretpostavljam da je ovo zbog toga sto je prvi put postavljen kuki u browser, pa sve zahteve sa lokalnog racunara racuna kao da su od istog usera. Jesam li u pravu?

Inace koristim NetBeans IDE sa integrisanim tomcatom. U HTTP monitoru postoji spisak svih POST zahteva (koji su poslati sa login forme), ali samo jedan GET zahtev(kad sam prvi put kliknuo na link ka drugom servletu i kad je ispravno prikazano ime i session ID). Svaki sledeci GET zahtev nije registrovan. Da li je ovo normalno?

Uzgred, izvinite ako sam naporan, ali ovo mi je stvarno vazno. Hvala svima.
[ dejankr @ 18.02.2004. 14:23 ] @
Ako ne koristiš deklarativni security, onda kontejner i ne zna da se korisnik ulogovao. On samo gleda cookie koji je smešten kod korisnika u trenutku kada si prvi put pozvao request.getSession(true). Svaki sledeći poziv ove metode ne kreira sesiju ukoliko ista postoji.
Da bi kontejner znao da ne treba da koristi više taj cookie, trebe da pozoveš Session.invalidate() prilikom logovanje korisnika tako da kontejner zna da treba da uništi tekuću sesiju. Posle toga možeš da kreiraš novu.

Nisam radio sa NetBeans ali pretpostavljam da bi trebalo da prikazuje sve zahteve.