richiesta.getSession(false) non restituisce null dopo la chiamata di sessione.invalidate()

Non dovrebbe invalidare una sessione di causa request.getSession(false) per restituire null? Nel mio logout servlet ho chiamata

session.invalidate();

e nel mio stato di accesso del filtro ho chiamata

request.getSession(false);

La chiamata a getSession(false) non restituisce null ma tutti gli attributi associati alla sessione oggetto restituito null. Io al momento di rilevare se un utente è connesso con la ricerca null per gli attributi, ma questo non mi sembra proprio.

  • Ci potrebbe essere qualcosa di esecuzione tra (dopo invalidare e prima di getsession), che è la creazione di sessione. Stai utilizzando una normale servlet o qualcos’altro anche (specialmente quella che richiede la sessione, ad esempio, il componente di base di framework come JSF può essere impostato per salvare gli stati sul server che richiede sessione)?
  • Pianura servlets quadro
  • Sto andando a guardare in giro e vedere se sono io il colpevole di chiamata richiesta.getSession(true) da qualche parte.
  • Come stai navigando da Logout Servlet per LoginStatus filtro, dopo invalidare la sessione?
  • Il logout servlet viene aperto quando si va a “Logout”, ma il logout lo stato del filtro filtri ogni richiesta in modo che se un utente è connesso e va alla homepage vedono i membri della pagina invece della schermata di login. Funziona il tutto. Ero solo di essere schizzinosi sull’uccisione di una sessione e non solo spogliandola gli attributi, che sembra essere ad ogni sessione.invalidate() effettivamente.

 

2 Replies
  1. 10

    Io al momento di rilevare se un utente è connesso con la ricerca null per gli attributi

    Che anche il normale approccio. Per controllare se un utente è registrato in, si dovrebbe sicuramente non controllare se il servletcontainer ha creato la sessione o non. Questo non rappresenta utente connesso a tutti.

    Su login, basta mettere il modello in oggetto, l’ambito di sessione senza controllare se il contenitore ha creato la sessione. In altre parole, basta usare getSession() senza boolean argomento, in modo che il contenitore autocreate, se necessario, si bisogno la sessione a questo punto comunque:

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);
    
        if (user != null) {
            request.getSession().setAttribute("user", user);
            response.sendRedirect(request.getContextPath() + "/home");
        } else {
            request.setAttribute("message", "Unknown login. Please retry.");
            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
        }
    }

    Sul filtraggio dell’accesso, basta controllare se la sessione attributo che rappresenta l’utente loggato è presente, si utilizza solo getSession(false) qui per evitare inutili creazione di una sessione, altrimenti per esempio searchbots innescherebbe creazione di una sessione che è del tutto inutile:

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        User user = (session != null) ? (User) session.getAttribute("user") : null;
        String loginURL = request.getContextPath() + "/login"; 
    
        if (user == null && !request.getRequestURI().equals(loginURL)) {       
            response.sendRedirect(loginURL);
        } else {
            chain.doFilter(request, response);
        }
    }

    Su logout, assicurarsi che si invia un redirect dopo invalidare, perché la sessione corrente è ancora disponibile nella risposta di un in avanti.

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getSession().invalidate();
        response.sendRedirect(request.getContextPath() + "/login");
    }
    • Questo è esattamente l’approccio che ho preso. Il fatto che l’oggetto session è stata ancora “valido” dopo invalidante, mi ha reso nervoso stavo facendo qualcosa di sbagliato, ma sembra che l’oro è in attributi in modo che starò corso. Grazie.
    • Sto cercando di indovinare il redirect è un metodo più rapido di imporre il browser per cancellare la cache come opporsi all’approccio specificato qui stackoverflow.com/questions/4194207 ?
    • Impedendo al browser di memorizzare nella cache le pagine con restrizione risolve completamente un altro problema che ha chiesto risposte qui. Se non si disattiva la cache del browser, quindi l’utente può vedere ancora le restrizioni pagine, premere il pulsante indietro. Se si disattiva la cache del browser, quindi l’utente sarà reindirizzato alla pagina di login premendo il pulsante indietro.
    • Qual è lo scopo di reindirizzare quindi se il tuo non lo uso per forzare l’aggiornamento?
    • Perché, come detto, la sessione corrente è ancora disponibile nella risposta di un in avanti.
    • si potrebbe ampliare la logica del motivo per cui hai deciso di utilizzare sendRedirect e RequestDispatcher nel modo in cui l’hai fatto con il LoginServlet esempio?

  2. 2

    per ogni servlet o jsp si è in viaggio si dovrebbe chiamare

    request.getSession(false);

    tranne che per la prima pagina in cui si crea il sessionby

    request.getSession(true);

    se non chiamare

    request.getSession(false);

    quindi la sessione non viene eseguita fino a che pagina
    quindi, prima di chiamare

    session.invalidate();

    assicurarsi che si sta continuando la sessione a che pagina chiamando

    request.getSession(false);
    • Grazie per la risposta. Chiamata getSession(true) non avrebbe mai restituito null. Il problema che ho è che getSession(false) non restituisce null quando è necessario. Per esempio, l’esecuzione del codice che ho fornito in precedenza un utente può ancora visitare le pagine che richiedono getSession(false)!=null
    • si chiama “sessione.invalidate();” ryt ?? sei sicuro che la pagina in cui yo chiama questa linea è avere la sessione , se non , plz chiamata “richiesta.getSession(false);” linea della pagina , possono essere i m non ottenere il vostro prob correttamente , ma dopo aver assicurarsi questo , si può arrivare a capire
    • Sì. Ho sempre chiamata getSession(false), eccetto dove voglio creare una sessione di login. Ho capito il concetto e sono in grado di login e accedere a tutte le funzioni che richiedono attributi memorizzati nella mia sessione. Il problema è quando si tenta di eseguire il logout tutto quello che succede quando invalidare una sessione è che tutti gli attributi sono stati rimossi, ma la sessione non andare null. Ho pensato che fosse il mio codice, ma credo che sia semplicemente come è. Grazie per l’aiuto comunque.

Lascia un commento