09. juli 2010 - 10:34Der 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?
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?
<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>
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?
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!
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?
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..?
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.