View Full Version : [JSP+EJB+JBOSS] Come mantenere una autenticazione durante una sessione?
EDIT: Domanda al post #13, please help me!
Ciao a tutti,
il problema e' questo: ho una serie di JSP che fanno delle richieste a delle session beans, le quali a loro volta istanziano delle entity bean, fanno delle query al database restituiscono i valori, le session bean elaborano e restituiscono ulteriori valori alle jsp.
Ok tutto questo gia' funziona, il problema e': tramite una jsp faccio il login, la session bean si occupa di verificare login e password e solo se e' ok fa passare alla prossima jsp.
Il problema e': se un utente mi accede alla prossima jsp perche' sa che esiste digitando l'indirizzo direttamente nel browser, in jboss ho visto che si puo'.
Come faccio a dirgli che non puo'?
Avevo pensato: trasferisco la password (criptata con lo SHA-1) da un jsp all'altro e ogni volta che faccio delle chiamate alla session bean devono corrispondere. Questo pero' mi costringe a fare una unica session bean che gestisce un utente dall'inizio alla fine o c'e' un modo per fare qualcosa di meglio?
Spero di essermi spiegato
non sono sicuro di aver capito.
le tue jsp dovrebbero solo verificare se esiste una sessione attiva per l'utente che sta facendo la richiesta, in caso contrario devono ridirigerlo verso la pagina di login.
E' l'application server che deve occuparsi di tenere in piedi le sessioni, non tu applicativamente.
non sono sicuro di aver capito.
le tue jsp dovrebbero solo verificare se esiste una sessione attiva per l'utente che sta facendo la richiesta, in caso contrario devono ridirigerlo verso la pagina di login.
E' l'application server che deve occuparsi di tenere in piedi le sessioni, non tu applicativamente.
Ecco esatto, ma non so come si fa a vedere se esiste una sessione attiva.
Cioe' per tenere in piedi una sessione devo avere una unica session bean o posso farlo con piu' session bean che diciamo "si passano la palla"? E in ogni caso come faccio a realizzare questo?
Grazie della pazienza
il fatto che si chiamino session bean non ha nulla a che fare con la sessione web, che a seguito di un login deve essere mantenuta dall'application server attraverso un meccanismo come cookie o url rewriting.
le jsp che compongono l'interfacia web, una volta autenticato, faranno le chiamate ai bean che implementano la logica applicativa, passano i parametri appropriati (userid, ad esempio).
se ho capito male fammi un esempio.
il fatto che si chiamino session bean non ha nulla a che fare con la sessione web, che a seguito di un login deve essere mantenuta dall'application server attraverso un meccanismo come cookie o url rewriting.
le jsp che compongono l'interfacia web, una volta autenticato, faranno le chiamate ai bean che implementano la logica applicativa, passano i parametri appropriati (userid, ad esempio).
se ho capito male fammi un esempio.
Lo so appunto per questo che sto cercando un metodo.
Cioe' se io parto da login.jsp che spedisce login e psw a loginBean.ejb, lei elabora e ritorna true se ok o false se non ok, il jsp se true fa forward alla pagina successiva che si chiama per es. due.jsp, ora pero' se uno sa che esiste due.jsp, puo' benissimo mettere nella barra del browser direttamente due.jsp e bypassare il check del login.
Allora vi stavo chiedendo come posso fare?
Lo so appunto per questo che sto cercando un metodo.
Allora vi stavo chiedendo come posso fare?
il flusso corretto è:
- login jsp chiama il bean per controllare username e password, se ok crea una sessione valida per l'utente
- due.jsp e qualsiasi altra pagina come prima cosa quando vengono chiamate controllano se c'e' una sessione valida per la richiesta che e' arrivara, in caso positivo rispondono alla richiesta, in caso negativo gestiscono l'errore (magari rimandando alla pagina di login).
il flusso corretto è:
- login jsp chiama il bean per controllare username e password, se ok crea una sessione valida per l'utente
- due.jsp e qualsiasi altra pagina come prima cosa quando vengono chiamate controllano se c'e' una sessione valida per la richiesta che e' arrivara, in caso positivo rispondono alla richiesta, in caso negativo gestiscono l'errore (magari rimandando alla pagina di login).
Perfetto, come faccio a creare e gestire una sessione valida?
Posso fare in modo che questa sessione sia "passata" tra le varie Bean?
la jsp ha un oggetto implicito "session".
all'inizio di ogni jsp puoi fare un controllo del tipo che se contiene un attributo a tua scelta (che viene settato SOLO dalla jsp di autenticazione in caso di esito positivo), in caso contrario fai una redirect alla pagina di login.
qualcosa tipo:
<% if (session.isNew() || session.getAttribute("autenticato") == null)
{
response.sendRedirect(response.encodeRedirectURL("login.jsp"));
}
else {
//ecc.ecc.
}
%>
la jsp ha un oggetto implicito "session".
all'inizio di ogni jsp puoi fare un controllo del tipo che se contiene un attributo a tua scelta (che viene settato SOLO dalla jsp di autenticazione in caso di esito positivo), in caso contrario fai una redirect alla pagina di login.
qualcosa tipo:
<% if (session.isNew() || session.getAttribute("autenticato") == null)
{
response.sendRedirect(response.encodeRedirectURL("login.jsp"));
}
else {
//ecc.ecc.
}
%>
Uh molto interessante.
ma mettere soltanto if (session.isNew()) che problemi puo' dare?
Uh molto interessante.
ma mettere soltanto if (session.isNew()) che problemi puo' dare?
che se chiedi la prima volta la pagina te la nega reindirizzandoti verso il login, ma alla seconda richiesta ti viene servita anche se il login non l'hai superato :eek: :p
che se chiedi la prima volta la pagina te la nega reindirizzandoti verso il login, ma alla seconda richiesta ti viene servita anche se il login non l'hai superato :eek: :p
Allora non basterebbe mettere la setAttribute e getAttribute?
Allora non basterebbe mettere la setAttribute e getAttribute?
sì effettivamente basterebbe quello, dato che quando la sessione e' nuova non avrà quell'attributo "custom" valorizzato ;)
sì effettivamente basterebbe quello, dato che quando la sessione e' nuova non avrà quell'attributo "custom" valorizzato ;)
Fantastico,
altre domandine fresche fresche:
- la variabile costumizzata non e' possibile dal client settarla vero? Questo dovrebbe assicurarmi la sicurezza al 100% che uno che non ha accesso al server non puo' accedere alle pagine successive.
- ne sai di EJB-QL?
Come si fa a fare in modo che l'id di una tabella venga creato da solo e che vada prograssivamente?
Ho provato il tag
@jboss.unknown-pk class="java.lang.Integer"
auto-increment="true"
ma con scarso successo :(
- la variabile costumizzata non e' possibile dal client settarla vero? Questo dovrebbe assicurarmi la sicurezza al 100% che uno che non ha accesso al server non puo' accedere alle pagine successive.
naturalmente no, sul client hai solo un cookie contenente l'identificativo della sessione ma gli attributi sono memorizzati sul server
- ne sai di EJB-QL?
zero, so solo cos'e' ma non l'ho mai usato :boh:
naturalmente no, sul client hai solo un cookie contenente l'identificativo della sessione ma gli attributi sono memorizzati sul server
Perfetto, grazie!
zero, so solo cos'e' ma non l'ho mai usato :boh:
Doh!
Qualcuno che mi puo' aiutare? :help:
kingv ti chiedo un'altra cosa:
se io ho un sistema gestito appunto da session e entity bean e dove i client sono dei jsp, come faccio a far si' che dal lato server, dopo una certa data e ora cambino delle cose?
Mi spiego: il server finche' non viene richiamato qualche business method non fa una cippa, quindi come faccio a fargli "controllare" il tempo e allo scadere di una data fa autonomamente una cosa?
kingv ti chiedo un'altra cosa:
Mi spiego: il server finche' non viene richiamato qualche business method non fa una cippa, quindi come faccio a fargli "controllare" il tempo e allo scadere di una data fa autonomamente una cosa?
ho capito il problema, se qualcuno non ti chiama non puoi fare il controllo dell'ora e quindi non puoi scatenare l'evento, vero?
non ti consiglio di usare una soluzione come un Thread o un Timer dato che le specifiche EJB impediscono l'uso esplicito dei thread (anche se quando mi e' capitato di usarli hanon sempre funzionato senza creare problemi con la gestione dell'application server :fagiano: ).
dalla release 1.4 di J2EE ho letto che c'e' il supporto di un timer service a livello di container. Dato che JBoss supporta quelle specifiche dovrebbe fornirlo, purtroppo non conosco un granchè il prodotto e non mi è mai capitato di usare questa caratteristica.
guarda la documentazione di javax.ejb.TimerService, dovrebbe essere quello che stai cercando ;)
ho capito il problema, se qualcuno non ti chiama non puoi fare il controllo dell'ora e quindi non puoi scatenare l'evento, vero?
non ti consiglio di usare una soluzione come un Thread o un Timer dato che le specifiche EJB impediscono l'uso esplicito dei thread (anche se quando mi e' capitato di usarli hanon sempre funzionato senza creare problemi con la gestione dell'application server :fagiano: ).
dalla release 1.4 di J2EE ho letto che c'e' il supporto di un timer service a livello di container. Dato che JBoss supporta quelle specifiche dovrebbe fornirlo, purtroppo non conosco un granchè il prodotto e non mi è mai capitato di usare questa caratteristica.
guarda la documentazione di javax.ejb.TimerService, dovrebbe essere quello che stai cercando ;)
Purtroppo sto facendo un progetto e le specifiche mi obbligano ad usare jboss 3.2.x che implementa J2EE 1.3
Le stesse specifiche mi impongono di mandare una mail allo scadere di una data... :muro:
kingv ho trovato questo http://docs.jboss.org/jbossas/admindevel326/html/ch10.html#ch10.sched.sect
il problema che non ho capito e':
se la data di attivazione dello scheduler e' da inserire nell'xml come cavolo faccio a runtime a cambiarla?
kingv ho trovato questo
se la data di attivazione dello scheduler e' da inserire nell'xml come cavolo faccio a runtime a cambiarla?
http://docs.jboss.org/jbossas/javadoc/3.2.7/varia/org/jboss/varia/scheduler/Scheduler.html
ci sono i "setter" per tutte le proprietà che ne definiscono il comportamento ;)
http://docs.jboss.org/jbossas/javadoc/3.2.7/varia/org/jboss/varia/scheduler/Scheduler.html
ci sono i "setter" per tutte le proprietà che ne definiscono il comportamento ;)
Si quella libreria l'avevamo vista, ma tutti i tutorial parlano di sto xml,
quindi io creo un'istanza direttamente nel mio progetto e setto tutto tramite i metodi?
Oggi pome ci provo, grazie, sempre disponibile come sempre :)
Ok, il problema e' che ho importato il pacchetto scheduler-plugin.jar pero' quando istanzio una nuova classe Scheduler mi dice questo:
the type org.jboss.system.ServiceMBeanSupport cannot be resolved it is indirectly referenced from required .class files
probabilmente devo includere un altro jar, ma non ho capito quale...
conosco poco JBoss e in questo istante non riesco a testare quel bean.
ho trovato questo tutorial, prova a vedere se puo' darti una mano.
http://www.huihoo.com/jboss/online_manual/3.0/ch13s58.html
conosco poco JBoss e in questo istante non riesco a testare quel bean.
ho trovato questo tutorial, prova a vedere se puo' darti una mano.
http://www.huihoo.com/jboss/online_manual/3.0/ch13s58.html
Grazie l'avevo trovato anche io, ma anche questo tutorial usa un file xml e non possiamo permettercelo perche' la data non la sappiamo a priori...
Grazie l'avevo trovato anche io, ma anche questo tutorial usa un file xml e non possiamo permettercelo perche' la data non la sappiamo a priori...
l'xml lo usa per definire il servizio Scheduler in jboss, per usarlo c'e' l'esempio con la codifica che ti serve ;)
l'xml lo usa per definire il servizio Scheduler in jboss, per usarlo c'e' l'esempio con la codifica che ti serve ;)
Adesso provo, ma non riesco molto a capire cosa devo fare esattamente...
Cioe' la mia domanda e' questa:
se c'e' gia' lo scheduler che fa tutto quello che voglio, perche' devo andare a scomodare tutto il resto del codice?
Cioe' la mia domanda e' questa:
se c'e' gia' lo scheduler che fa tutto quello che voglio, perche' devo andare a scomodare tutto il resto del codice?
la prima parte (creare e connetterti a un MBeanServer) non seguirla se usi JBoss.
Il resto del codice è solo per indicare come si fa a creare e a utilizzare il Timer Service. Ti ricordo che questo servizio è implementato con un EJB ed è quindi distribuito, non necessariamente locale alla jvm che stai utilizzando.
Sei sicuro di aver bisogno delle funzionalità che ti fornisce?
la prima parte (creare e connetterti a un MBeanServer) non seguirla se usi JBoss.
Il resto del codice è solo per indicare come si fa a creare e a utilizzare il Timer Service. Ti ricordo che questo servizio è implementato con un EJB ed è quindi distribuito, non necessariamente locale alla jvm che stai utilizzando.
Sei sicuro di aver bisogno delle funzionalità che ti fornisce?
Quello che mi serve e' semplicemente un qualcosa che mi attiva una funzione ad un dato giorno e ad una data ora.
Questo giorno e ora deve essere impostabile a runtime.
Guardando il primo link che mi hai dato con le specifiche dello scheduler ho provato a fare cosi':
Scheduler sc = new Scheduler("middleware.ejb.ExSchedulable","TheData,1234","java.lang.String,long","dd/MM/yyyy HH.MM","24/06/2005 11.39",60000,-1);
sc.startSchedule();
dove il primo argomento indirizza ad una semplice classe che riceve due parametri un String e un long e ha un metodo perform che stampa una parola.
Mi da questo errore:
11:38:31,656 ERROR [Scheduler] operation failed
java.lang.NullPointerException
at org.jboss.varia.scheduler.Scheduler.startSchedule(Scheduler.java:394)
at middleware.ejb.ManageLoginBean.loginProf(ManageLoginBean.java:130)
e poi continua...
Quello che mi serve e' semplicemente un qualcosa che mi attiva una funzione ad un dato giorno e ad una data ora.
Questo giorno e ora deve essere impostabile a runtime.
allora mi rimangio quello che ho detto prima, usa un oggetto Timer schedulando i task che ti occorrono.
per il TimerService non so aiutarti :boh:
allora mi rimangio quello che ho detto prima, usa un oggetto Timer schedulando i task che ti occorrono.
per il TimerService non so aiutarti :boh:
Cioe' secondo te non basta quello che ho fatto io?
Cioe' secondo te non basta quello che ho fatto io?
secondo me non hai configurato correttamente il servizio a livello di application server, come ti ho detto ora non ho tempo di installare jboss e provare e sono funzionalità che non ho mai usato
secondo me non hai configurato correttamente il servizio a livello di application server, come ti ho detto ora non ho tempo di installare jboss e provare e sono funzionalità che non ho mai usato
Ho risolto usando l'oggetto timer di java che lancia uno scheduler con associato un thread e una data, funziona alla grande e senza xml da configurare.
http://java.sun.com/docs/books/tutorial/essential/threads/timer.html
Volevo chiederti:
ho usato questo esempio
http://www.javacommerce.com/displaypage.jsp?name=javamail.sql&id=18274
per spedire mail a normali indirizzi funziona benissimo, ma per spedire mail ai newsgroup non funziona da l'errore che riporto sotto, quello che volevo sapere e' se una limitazione di questo metodo e ce n'e' un altro oppure e' jboss che ha un bug.
09:41:03,421 INFO [STDOUT] Sending failed;
nested exception is:
class javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
class javax.mail.SendFailedException: 501 <it.comp.java> Invalid mail address, must have a domain part
ma per spedire mail ai newsgroup non funziona da l'errore che riporto sotto, quello che volevo sapere e' se una limitazione di questo metodo e ce n'e' un altro oppure e' jboss che ha un bug.
cosa intendi per spedire mail a un newsgroup?
il protocollo NNTP è diverso da SMTP, solo in caso di newsgroup moderati, se non sbaglio, il post avviene mandando una mail a un moderatore che poi pubblica il messaggio sul gruppo di discussione.
cosa intendi per spedire mail a un newsgroup?
il protocollo NNTP è diverso da SMTP, solo in caso di newsgroup moderati, se non sbaglio, il post avviene mandando una mail a un moderatore che poi pubblica il messaggio sul gruppo di discussione.
Si devo gestire il protocollo NNTP, e' possibile con la funzione che ho trovato o bisogna usare altri componenti?
Si devo gestire il protocollo NNTP, e' possibile con la funzione che ho trovato o bisogna usare altri componenti?
no, che io sappia JavaMail non supporta NNTP, devi trovare qualche libreria aggiuntiva.
no, che io sappia JavaMail non supporta NNTP, devi trovare qualche libreria aggiuntiva.
quindi in Java non c'e' nessuna classe che ti permetta di inviare mail con il protocollo NNTP?
quindi in Java non c'e' nessuna classe che ti permetta di inviare mail con il protocollo NNTP?
che io sappia nelle librerie standard no :boh:
che io sappia nelle librerie standard no :boh:
Conosci qualche libreria open source e free che posso usare? Non mi interessa leggere le mail, soltanto spedire ai newsgroup.
Ho trovato da solo!
Per mandare mail usando il protocollo NNTP c'e' il progetto Jakarta, in particolare il pacchetto commons-net:
http://jakarta.apache.org/commons/net/
Ho trovato da solo!
http://jakarta.apache.org/commons/net/
:doh: le ho pure usate per il protocollo FTP ma non ricordavo assolutamente che supportassero anche NNTP
una domanda stupidissima:
se io ho una collection di array di stringhe e una stringa, come si fa in java a creare un tipo personalizzato che contenga una collection e una stringa?
Devo creare una classe?
una domanda stupidissima:
se io ho una collection di array di stringhe e una stringa, come si fa in java a creare un tipo personalizzato che contenga una collection e una stringa?
Devo creare una classe?
esatto, crei una classe con gli attributi che ti interessano, in questo caso con una Stringa e una Collection
esatto, crei una classe con gli attributi che ti interessano, in questo caso con una Stringa e una Collection
perfetto, proprio come pensavo grazie!
Ok,
ho un problema pero': la classe che ho fatto la devo passare ad un file che non ha la possibilita' di includere la stessa classe della sorgente.
Mi spiego: A richiama un metodo di B che restituisce una istanza della mia classe personalizzata.
Pero' A e B non possono includere lo stesso file con la stessa definizione della mia classe, perche' potrebbero essere su un server differente, come faccio?
L'ho scritta sia in A che in B, ma lui dice che sono due classi differenti anche se il codice e' identico!
Se non ho capito male quello che intendi, la classe che definisce Collection e String deve stare in un file in cui è presente solo lei.
Lo compili e lo metti a disposizione sui server coinvolti.
Se l'oggetto deve essere passato in qualche modo da un server all'altro, allora la classe di cui stiamo parlando deve anche implementare java.io.Serializable per poter essere serializzata e trasmessa tra i vari server.
Grazie ho capito tutto.
la jsp ha un oggetto implicito "session".
all'inizio di ogni jsp puoi fare un controllo del tipo che se contiene un attributo a tua scelta (che viene settato SOLO dalla jsp di autenticazione in caso di esito positivo), in caso contrario fai una redirect alla pagina di login.
qualcosa tipo:
<% if (session.isNew() || session.getAttribute("autenticato") == null)
{
response.sendRedirect(response.encodeRedirectURL("login.jsp"));
}
else {
//ecc.ecc.
}
%>
Tornando al topic iniziale ho trovato questo bug che non capisco come correggere:
se io sono in una pagina e faccio LOG OUT che altro non fa che mettere session.security a "" e poi faccio BACK sul browser e clicco su una pagina, quella mi viene visualizzata invece che reindirizzarmi al login perche' l'autenticazione non e' piu' valida.
Ad ogni pagina ho messo:
if ((session.isNew()) || (session.getAttribute("security")==null) || (session.getAttribute("security")!="ProfPass"))
{
%>
<jsp:forward page="loginProf.jsp"/>
<%
}
idee sul mio ultimo post?
kingv sai darmi un aiuto?
grazie.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.