Avatar billede kkaen Nybegynder
09. juli 2010 - 10:34 Der er 20 kommentarer og
1 løsning

Slette data i session ved browser-luk

Jeg har en applikation, hvor man logger ind gennem en form. Resultatet heraf gemmes i Session, så applikationen hele tiden ved, hvilke rettigheder brugeren har.
Problemet opstår, når en bruger logger ind som administrator, og browseren (tab'en) lukkes. Den næste bruger på computeren, som går ind i applikationen gennem en ny browser-tab, kan så også tilgå administrator-siderne. Hvordan forhindres dette? Kan man sætte session manuelt til null, når en tab lukkes?
Avatar billede arne_v Ekspert
09. juli 2010 - 15:29 #1
Jeg vil tro at alle browsere betragter flere tabs i en process som vaerende samme session.

Du kan forsoege med:
- stor fed logout knap paa siden
- noget JavaScript som sender en request til en lille servlet som invaliderer session ved close

Men det er kun en 98% loesning.
Avatar billede kkaen Nybegynder
10. juli 2010 - 19:16 #2
Det vil jeg også tro. Det er i hvert fald min erfaring, at når man gemmer data i sessionen, man lukker tab'en, og en ny tab åbnes, så har den nye tab (evt. ny bruger med andet login) adgang til data i sessionen fra tidligere tabs. Dette må da kunne udgås. Også uden en knap til logoff. Evt. så det ikke er muligt blot at lukke en tab ned, så brugeren bliver tvunget til enten af logge ud eller lukke hele browser-vinduet ned (så går jeg da ud fra, at sessions-data slettes automatisk).

Noget javascript der registrer en tab-lukning, vil bestemt også være en mulig løsning. Men hvordan gøres dette? Kan det overhovedet registreres, at tab'en lukkes? Og i så fald kan der så køres noget javascript-kode (eller anden type kode), før vinduet lukkes ned?
Avatar billede arne_v Ekspert
11. juli 2010 - 03:36 #3
Ja - hvis browseren lukkes så mister den session.

Jeg mener stadigvæk at:
- logud knap
- undervisning af brugere
- forholdsvis kort tid for session timeout
er en mulighed.
Avatar billede arne_v Ekspert
11. juli 2010 - 03:37 #4
JavaScript ser ikke så lovende ud.

<script type="text/javascript">
window.onunload = function() {
    alert("tab closing or leaving site - we will now make a HTTP request to a servlet invalidating session");
}
</script>

trigges af meget mere end tab close.
Avatar billede arne_v Ekspert
11. juli 2010 - 03:40 #5
Men jeg tror at jeg har en løsning !

Gå ind i serverens konfiguration og disable cookies support. Det vil tvinge serveren til at bruge URL rewriting.

Med URL rewriting mistes session ved tab close (fordi URL er per tab mens cookies er per browser instans).

For Tomcat betyder det:

<context ... cookies="false" ...>
...
</context>

Bemærk at det kræver at din web app fungerer med URL rewriting. Det er ikke vært, men mange glemmer det!
Avatar billede kkaen Nybegynder
11. juli 2010 - 12:44 #6
Det lyder som et godt trick.
URL-rewriting - er det så noget med, at alle sider i applikationen skal kaldes på en ny måde i den genererede kode? Eller er det noget, man blot kan sætte til på serveren, uden nogen anden effekt registreres?
Avatar billede arne_v Ekspert
11. juli 2010 - 16:51 #7
Med en velskrevet Java web app, så skal der ikke ændres i koden.

Med en mere typisk web app opdager man alle de steder hvor man har glem at rewrite links.
Avatar billede arne_v Ekspert
11. juli 2010 - 16:55 #8
Man bør aldrig bruge:

<a href="foobar.jsp">bla bla</a>

men altid:

<a href="<%=response.encodeURL("foobar.jsp")%>">bla bla</a>

(eller endnu bedre et taglib/web framework som gør den slags automatisk)
Avatar billede kkaen Nybegynder
11. juli 2010 - 17:25 #9
Ah, jeg havde godt set muligheden for det angivne. Jeg vidste bare ikke, hvad der var opnåeligt med det. Det vil jeg da lige afprøve så.

Hvad er årsagen til, at man ikke "bør" benytte den gammeldags metode til <a href> ?
Avatar billede arne_v Ekspert
11. juli 2010 - 17:46 #10
Med URL rewriting gemmes session id i selve URL'en.

<a href="foobar.jsp">bla bla</a>

taber sessionen for der ikke er nogen session id i URL

<a href="<%=response.encodeURL("foobar.jsp")%>">bla bla</a>

response.encodeURL tilføjer session id til URL hvis nødvendigt (fordi cookies er disablet enten client eller server side)
Avatar billede kkaen Nybegynder
02. august 2010 - 09:58 #11
Så er jeg gået i gang igen :-)

Burde jeg også bruge response.encodeURL() til redirect inde fra codebehind?
Avatar billede arne_v Ekspert
02. august 2010 - 15:11 #12
Ja
Avatar billede kkaen Nybegynder
03. august 2010 - 11:13 #13
Nu har jeg forsøgt at bruge response.encodeURL("../index.jsp"); under logout.
Men under kørsel ignoreres linien blot - altså kodelinier i resten af jsp-siden udføres. Og så kommer der en exception længere nede i dokumentet af typen: org.apache.jasper.JasperException: java.lang.NullPointerException.

I linienummeret ved excpetionen står der hele tiden 176. I linie 176 havde jeg blot check for, hvem der var logget ind. Så udkommenterede jeg denne kode, for at debugge. Men exceptionen opstår stadig her - altså i udkommenteret kode. Strange!
Avatar billede kkaen Nybegynder
03. august 2010 - 11:20 #14
Hvordan kan det være, at jeg ikke kan få redirected til en anden jsp-side midt i det hele?
Avatar billede arne_v Ekspert
04. august 2010 - 04:05 #15
Man kan kun redirecte som det første.
Avatar billede kkaen Nybegynder
04. august 2010 - 08:15 #16
"Kun redirecte som det første" ? Den fangede jeg ikke helt betydningen af :-)
Avatar billede kkaen Nybegynder
04. august 2010 - 09:47 #17
Det, jeg prøver, er, lige efter
<%@ page import....
har jeg fanget et knap-tryk således:
if (request.getParameter("logout") != null) {
  ownSession.setAttribute("j_unsername", null);
  String requestURL = request.getRequestURL().toString();
  String servletPath = request.getServletPath();
  String appPath = requestURL.substring(0, requestURL.indexOf(servletPath));
  response.sendRedirect(response.encodeRedirectURL(appPath+"/index.jsp"));
...
%>

Så har jeg søgt lidt efter andre muligheder til redirecte, men heller ingen af dem virker. Findes der andre gode mådeer at redirecte på? (altså som virker...)

Ellers har jeg overvejet, om TomCat implicit kan klare tricket. For når ownSession.setAttribute("j_unsername", null); skal TomCat vel opfange, at brugeren ikke længere er logget ind, og derfor automatisk redirecte siden til login-siden, som er angivet i web.xml?
Avatar billede kkaen Nybegynder
04. august 2010 - 10:30 #18
Nu har jeg forsøgt, at redirecte fra en servlet, som kaldes i stedet for det hidtidige forsøgt på redirecte gennem scriplet. Men her kan jeg heller ikke redirecte fra. Resten af koden i kalde-jsp'en kører i hvert fald videre..?
Avatar billede kkaen Nybegynder
04. august 2010 - 11:11 #19
Efter lang tids søgen fandt jeg denne side:
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/servlets/urlredirection/ServletURLRedirection.html

Og nu har jeg benyttet:
RequestDispatcher rd=request.getRequestDispatcher("/redirected.jsp");
rd.forward(request, response);

hvorefter logout ser ud til at virke. Er denne løsning en acceptabel løsning? (altså ud over den tilsyneladende virker)
Avatar billede kkaen Nybegynder
30. december 2010 - 15:54 #20
Arne->
Læg venligst et "svar" :-)
Avatar billede arne_v Ekspert
30. december 2010 - 18:09 #21
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester