Newsgroup: it.comp.java
Titolo: Filtro per autorizzazione accesso alle pagine...

Salve ragazzi,
avrei bisogno di aiuto per risolvere il mio problema.
Sto realizzando un'applicazione in jsf ed ho creato un filtro per
gestire l'autorizzazione dell'accesso alle pagine.
Ho creato un oggetto visit di tipo session,l'utente si logga e le
informazioni vengono settate in questo visit.
Ad ogni apertura di pagina parte il filtro che controlla se un oggetto
visit è instanziato o meno nella sessione,se sì accedi alla pagina,se
no rimanda al login.
Questo problema l'ho risolto e il filtro fa il suo dovere.
Mi restano aperte 2 questioni,scusate la mia inesperienza in java..
codice:
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class AuthorizationFilter implements Filter {
        /**
         * @uml.property name="config"
         * @uml.associationEnd
         */
        FilterConfig config = null;
        /**
         * @uml.property name="servletContext"
         * @uml.associationEnd
         */
        ServletContext servletContext = null;
        public AuthorizationFilter() {
        }
        public void init(FilterConfig filterConfig) throws
ServletException {
                config = filterConfig;
                servletContext = config.getServletContext();
        }
        public void doFilter(ServletRequest request, ServletResponse
response,
                        FilterChain chain) throws IOException,
ServletException {
                Utils.log(servletContext, "Inside the filter");
                HttpServletRequest httpRequest = (HttpServletRequest)
request;
                HttpServletResponse httpResponse =
(HttpServletResponse) response;
                HttpSession session = httpRequest.getSession();
                String requestPath = httpRequest.getPathInfo();
                Visit visit = (Visit) session.getAttribute("visit");
                if (visit == null) {
                        System.out.println("Visit Nullo");
                        session.setAttribute("originalTreeId",
httpRequest
                                        .getPathInfo());
                        Utils.log(servletContext, "redirecting to "
                                        + httpRequest.getContextPath()
+ "/faces/Login.jsp");
httpResponse.sendRedirect(httpRequest.getContextPath()
                                        + "/index.jsp");
                }
                else {
                        chain.doFilter(request, response);
                }
                Utils.log(servletContext, "Exiting the filter");
        }
        public void destroy() {
        }
}
nel mio authentication bean,dopo il login con successo nello stesso
metodo setto il visit così
loggedIn=true;
codice:User newUser = new User(loginName, password,teamName, role);
Visit visit = new Visit();
visit.setUser(newUser);
visit.setAuthenticationBean(this);
visit.setLoggedIn(loggedIn);
setVisit(visit);
getApplication().createValueBinding("#{sessionScope.visit}").setValue(faces_Context,visit);
questa è la mia funzione per il logout
codice:FacesContext facesContext = getFacesContext();
                Utils.log(facesContext, "Executing
AuthenticationBean.logout()");
                HttpSession session = (HttpSession)
facesContext.getExternalContext()
                                .getSession(false);
                session.removeAttribute("sessionScope.visit");
                if (session != null) {
                        session.invalidate();
                }
Ecco le mie 2 problematiche:
1) come posso far sì che se un altro utente prova a loggarsi con gli
stessi dati di un utente in navigazione viene fermato?
2) Come posso gestire la chiusura del browser anticipata?
Avevo pensato di creare una variabile booleana loggedin inizializzata a
false e settarla a true nel visit quando l'utente si logga...ma poi?
Potete aiutarmi con semplice codice o spiegazioni?
Grazie mille...

 2) Come posso gestire la chiusura del browser anticipata?
Non credo si possa. Se inciampo e stacco la spina del PC, il browser non 
potra' mai spedire un messaggio del tipo "mi sono chiuso !".
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

grazie Giambo per la risposta,
ma ho un'altra domanda da farti.
Mettiamo che io setti questa variabile logged nel database,esisterà un
modo per far sì che periodicamente,dopo un certo periodo di
inattività dell'utente, l'applicazione risetti il flag.
Ho letto della possibilità di realizzare un listener che calcoli il
tempo di inattività,ma non ho idea di come farlo...sapresti aiutarmi?
Grazie

 tempo di inattività,ma non ho idea di come farlo...sapresti aiutarmi?
Si, devi implementare l'interfaccia HttpSessionBindingListener:
"
Causes an object to be notified when it is bound to or unbound from a 
session. [...]. This may be as a result of a servlet programmer 
explicitly unbinding an attribute from a session, due to a session being 
invalidated, or due to a session timing out.
"
Cioe' l'oggetto che implementa questa interfaccia riceve una notifica 
quando viene "legato" o "slegato" da una session. Quando per esempio la 
sessione scade, l'oggetto riceve una notifica: A questo punto puoi 
resettare il flag nel database.
Per esempio, se usi un'oggetto di tipo "User":
   public class User implements HttpSessionBindingListener {
     ...
     public void valueBound(HttpSessionBindingEvent event) {
       // richiamato quando questo oggetto viene settato nella session:
       // - Settare il flag "logged" nel database
     }
     public void valueUnbound(HttpSessionBindingEvent event) {
       // richiamato quando questo oggetto viene tolto dalla session
       // (Quando la session scade o quando viene rimosso "a mano"):
       // - Resettare il flag nel database
     }
   }
Quindi, al momento del login il codice sara' qualcosa del tipo:
   User user = new User();
   ...
   HttpSession session = request.getSession();
   session.setAttribute("user", user); // viene richiamato valueBound
e al momento del logout qualcosa del tipo:
   HttpSession session = request.getSession();
   session.removeAttribute("user"); // viene richiamato valueUnbound
Quel che ti rimane e' trovare una "durata di vita" ottimale per la 
session, cosi' che un'utente che ha chiuso accidentalmente il browser 
non debba aspettare troppo per poter rifare il login; ma allo stesso 
tempo non puoi permettere che se l'utente rimane inattivo pochi minuti 
la sessione scada.
Potresti anche pensare ad un meccanismo per il quale se un'utente prova 
a fare un "doppio login", quello precedente viene automaticamente 
invalidato (Meccanismo che si puo' prestare ad abusi, IMHO).


GRAZZZZZZZZIEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ho risolto il problema con il tuo aiuto!!!!!!!!!!!!!!!!!!!!!!!!!!
Vorrei un consiglio da te, secondo te mi conviene memorizzare una
connessione a un db nella sessione dell'utente o crearla e distruggerla
ad ogni operazione sul db?
E' un'applicazione interattiva di inserimenti esperimenti e semplici
ricerche....
mi daresti un consiglio?
Grazie ancora

 ad ogni operazione sul db?
Aprire una connessione e' un'operazione piuttosto costosa. Meno ne fai, 
meglio e'. Per questo esistono le "Connection Pool": Le connessioni una 
volta che hanno svolto il loro lavoro non vengono chiuse/distrutte, ma 
finiscono in un pool per poi venir riutilizzate.
Una volta le connecgtion pool erano da fare a mano, ma al giorno d'oggi 
le trovi anche nelle scatole dei cereali ;)
Cosa usi come servlet-engine ? Forse c'e' gia' qualcosa di fatto ...
