Avatar billede svarrer Nybegynder
16. oktober 2007 - 09:17 Der er 4 kommentarer og
1 løsning

timeout på objekter i session

Hejsa

er det muligt at lave en form for timeout på objekter der bliver lagt i session?. Jeg ønsker ikke at hele sessionen skal time ud.
Strukturen i mit site er på en sådan måde at det er svært at afgøre hvornår et givent objekt er overflødigt og dermed kan fjernes med removeAttribute("myObj"); hvilket resultere i at min session efter nogen brug er "plastret" til med irrelevante objekter. :-(

på forhånd tak
Avatar billede fsconsult.dk Nybegynder
16. oktober 2007 - 09:30 #1
du kan ikke lave timeout på sessionsobjekter, men du kan bruge et cache system (som f.eks. OSCache eller EHCache), som kan hjælpe dig med forskellige metoder til at unloade objekter i cachen.
Avatar billede arne_v Ekspert
17. oktober 2007 - 04:03 #2
Hvis man vil kan man godt lave noget.

Man kan bruge en SessionAttributeListener.

Jeg lavede et lille eksempel til at demo'e hvordan man kan gribe det an.

TimeoutEnforcer.java
--------------------

package test;

import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class TimeoutEnforcer implements HttpSessionAttributeListener {
    private final static int CHECK_MS = 1000;
    private LinkedList itms;
    private Timer t;
    public TimeoutEnforcer() {
        itms = new LinkedList();
        t = new Timer(true);
        t.scheduleAtFixedRate(new Checker(itms), CHECK_MS, CHECK_MS);
    }
    public void attributeAdded(HttpSessionBindingEvent sbe) {
        synchronized(itms) {
            itms.add(new Item(sbe.getSession(), sbe.getName(), System.currentTimeMillis()));
        }
    }
    public void attributeRemoved(HttpSessionBindingEvent sbe) {
        synchronized(itms) {
            itms.remove(new Item(sbe.getSession(), sbe.getName(), 0));
        }
    }
    public void attributeReplaced(HttpSessionBindingEvent sbe) {
        // do nothing
    }
}

class Checker extends TimerTask {
    private final static int TIMEOUT_MS = 10000;
    private LinkedList ll;
    public Checker(LinkedList ll) {
        this.ll =ll;
    }
    public void run() {
        long cut = System.currentTimeMillis() - TIMEOUT_MS;
        synchronized(ll) {
            Item o;
            while((o = (Item)ll.peek()) != null && (o.getTime() < cut)) {
                o.getSession().removeAttribute(o.getAttribute());
            }
        }
    }
}

class Item {
    private HttpSession session;
    private String attribute;
    private long time;
    public Item(HttpSession session, String attribute, long time) {
        this.session = session;
        this.attribute = attribute;
        this.time = time;
    }
    public HttpSession getSession() {
        return session;
    }
    public String getAttribute() {
        return attribute;
    }
    public long getTime() {
        return time;
    }
    public boolean equals(Object o) {
        if(o instanceof Item) {
            Item oitem = (Item)o;
            if(session.equals(oitem.session) && attribute.equals(oitem.attribute)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    public int hashCode() {
        return (session.hashCode() + attribute.hashCode());
    }
}

web.xml
-------

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
    <listener>
        <listener-class>test.TimeoutEnforcer</listener-class>
    </listener>
</web-app>

test.jsp
--------

<meta http-equiv="refresh" content="1">
<%
Object o = session.getAttribute("test");
if(o == null) {
    out.println("Missing");
    session.setAttribute("test", "something");
} else {
    out.println("Present");
}
%>
Avatar billede arne_v Ekspert
17. oktober 2007 - 04:06 #3
Tids konstanterne skal nok justeres, men jeg ville se noget hurtigt ved test.

Jeg er absolut ikke overbevist om at teknikken er bedre end et cache bibliotek, men
det kan lade sig gøre.

Og er efter min mening et godt eksempel på styrken i J2EE (JEE) API'erne. Man kan faktisk
meget !
Avatar billede arne_v Ekspert
26. november 2007 - 21:53 #4
ok ?
Avatar billede svarrer Nybegynder
27. november 2007 - 08:02 #5
Det er perfekt..endnu engang tak for din ekspertise !
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