Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615

    Errore per acquisizione variabile di sessione

    Cari utenti,
    sarò dettagliatissimo. La mia web app in Java ha una classe che acquisisce una variabile di sessione mediante il codice

    codice:
    HttpSession LoginSession = request.getSession();
    String VAR = LoginSession.getAttribute("myVar").toString();   //questa è proprio la riga 127
    Testando l'applicazione in locale (Mac + Java 1.8 + Tomcat 8) tutto funziona perfettamente. Testando l'applicazione in remoto (Ubuntu 14.10 + Java 1.8 + Tomcat 8) tutto funziona, tranne proprio la classe che comprende quel codice generando il seguente messaggio di errore, riferito alla seconda delle due righe sopra indicate. Il messaggio riguarda senz'altro la seconda delle due righe che ho indicato all'inizio, in quanto lasciandole commentate compare un nuovo messaggio di errore riferito questa volta ad una riga del mio codice più in basso, che è quasi identica alla prima. Trasformando in commento tutte le righe simili e impostando variabili fisse al posto di quelle di sessione, l'errore scompare. Ecco l'errore completo.

    codice:
    14-Dec-2014 08:15:23.923 SEVERE [http-nio-8080-exec-14] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [srvNavigation.SrvPT] in context with path [/myapp] threw exception
     java.lang.NullPointerException
        at srvNavigation.SrvPT.doGet(SrvPT.java:127)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
        at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
    Come risolvere il problema?

    Grazie a tutti in anticipo!
    Ultima modifica di Shadow976; 14-12-2014 a 16:59

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    Signori, il problema mi è chiaro. La ragione un po' meno, ma sono in grado di risolvere. Nella mia web app ci sono due servlet; una imposta una variabile di sessione, l'altra la legge. In testa ad entrambe le classi vi è la prima delle due righe che ho postato. Cosa ho fatto? Ho impostato un banalissimo println in entrambe le classi, che stampa l'ID della sessione e la famosa variabile myVar. Ecco il risultato del println, magari può esservi utile.

    IN LOCALE:
    Entrambi gli ID di sessione uguali
    Variabile myVar nella classe che la imposta, "ok"
    Variabile myVar nella classe che la legge, "ok"

    IN REMOTO (LEGGENDO CATALONA.OUT)
    Gli id di sessione delle due servlet, aperte a pochi istanti l'una dall'altra, sono diversi (possibile? Ossia due classi di una stessa applicazione hanno il comando di sessione indicato sopra alla prima delle due righe e, istanziate nella stessa sessione di utilizzo della stessa app, "vedono" due sessioni diverse);
    Ovviamente, la variabile myVar nella classe che la imposta è "ok", ma la variabile myVar nella classe che dovrebbe leggerla è null.

    Scusate la domanda, ma come si spiega questa differenza tra il comportamento in locale ed in remoto? Non tanto per il quesito (risolverò facilmente con una variabile globale), ma vorrei capire. Grazie a tutti.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ci sarà qualche configurazione del servlet container remoto che cozza con l'uso delle sessioni.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    GRAZIE LELE! Finalmente qualcuno mi ha risposto, era davvero importante e urgente.

    Allora, io stesso ho installato il Tomcat in remoto e non ho fatto assolutamente nulla se non cambiare le credenziali dell'utente manager (quello che carica le app) come è procedura standard. Dove trovo le impostazioni del Tomcat che gestiscono le sessioni? Nel file di configurazione non c'è nulla di specifico.

    (guarda, forse sei sulla giusta strada; tra il Tomcat remoto ed il locale, pur essendo della medesima versione 8.0.qualcosa, c'è una differenza di cinque valori nel numero della subversion, quello per capirci dopo l'underscore.

    Attendo lumi, sono nelle tue mani! E grazie ancora.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Mi viene in mente un'altra cosa.
    Dici che hai 2 servlet: una che imposta il valore, l'altra che lo legge. Chi è che invoca la seconda servlet? Ed in che modo? Perchè ho il forte sospetto che sia un problema di fondo, di implementazione della web-app.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Ciao Shadow,
    Il comportamento che hai penso che non dipenda dalla versione di tomcat.
    Ho notato (nell'altro post) che usi HTTPSession LoginSession = request.getSession();
    Cioè il metodo getSession senza parametri e quindi quello che succede in una delle due servlet e che la sessione ti arriva null e qundi ti viene restituita una nuova sessione (se al posto di getSession() metti getSession(false) ti dovrebbe dare la sessione null).
    Una cosa che puoi fare per capire cosa succede alla tue sessioni e scrivere un HttpSessionListener e farti stampare quando ti viene creata la sessione ed eventualmente quando ti viene distrutta.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    E' per questo che ho chiesto CHI chiama la seconda servlet.
    Perchè secondo me avviene un passaggio (che non è scritto da nessuna parte nei due post) in cui è la prima servlet (o un componente lato server) a richiamare la seconda mediante richiesta HTTP. Questo spiegherebbe perchè in locale funziona, mentre in remoto no.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    E' per questo che ho chiesto CHI chiama la seconda servlet.
    Perchè secondo me avviene un passaggio (che non è scritto da nessuna parte nei due post) in cui è la prima servlet (o un componente lato server) a richiamare la seconda mediante richiesta HTTP. Questo spiegherebbe perchè in locale funziona, mentre in remoto no.


    Ciao.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    GRAZIE TANTISSIMO PER I VOSTRI MESSAGGI E PER IL TEMPO CHE MI AVETE DEDICATO.

    Purtroppo sono tornato solo ora, domani mattina risponderò a tutte le vostre osservazioni dandovi le informazioni richieste. A domani e grazie ancora.

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    Intanto grazie di nuovo a entrambi. Posto nel dettaglio il modo in cui le servlet vengono chiamate.

    1) La pagina jsp di login invia via Ajax le credenziali inserite dall'utente alla servlet UserCheck tramite la riga di codice

    codice:
    titleAjax.open("GET","SrvUserCheck?org=" + org + "&usr=" + usr + "&psw=" + psw + "&scp=" + scp + "&_="+-new Date, false);
    La servlet User Check è proprio la prima delle due, quella che imposta la variabile di sessione


    2) La servlet User Check verifica l'utente e restituisce alla pagina jsp di login una stringa di conferma (in pratica, questa stringa di conferma è la risposta alla richiesta Ajax appena fatta); in quel caso lo stesso codice Ajax di quella pagina, ricevuta tale stringa di conferma, istanzia una nuova servlet che apre la pagina di benvenuto del programma tramite il codice

    codice:
    document.location.href = 'SrvPT?page=intro' 
    La servlet SrvPT è invece la seconda, quella che dovrebbe leggere le variabili di sessione impostate nella prima; io mi aspetto che i due ID sessione coincidano e invece questo non accade (ecco perché anche i valori associati alla sessione stanziata da questa seconda servlet sono nulli; le due sessioni non coincidono).

    Ossia, pagina login JSP -> credenziali inserite dall'utente -> Invio tramite Ajax di quelle credenziali alla servlet di check -> la servlet di check restituisce alla richiesta Ajax appena compiuta una stringa di conferma (sino a questo punto l'utente vede sempre la pagina di login, sono tutte azioni compiute via Ajax) -> solo a quel punto, ricevuta la conferma, la pagina di login istanzia via javascript la servlet che apre la pagina intro.

    Spero di essere stato abbastanza dettagliato, grazie ancora... Attendo vostri lumi! Se vi servono altri dettagli sono qui.
    Ultima modifica di Shadow976; 18-12-2014 a 12:04

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.