2016-04-19 7 views
7

voglio ottenere il tempo della sessione out messaggio quando l'expires.Below sessione è il mio primavera-security.xmlCome ottenere il tempo della sessione out messaggio utilizzando la protezione Primavera

<http auto-config="true" use-expressions="true"> 
    <logout logout-success-url="/" invalidate-session="true" logout-url="/LogOut"/> 
    <form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/> 
    <session-management invalid-session-url="/?timeout=true"> 
     <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" /> 
    </session-management> 
</http> 

Secondo la mia conoscenza con sopra codice quando la sessione è scaduta dovrebbe reindirizzare a /?timeout=true OR /Timeout?timeout=true. E al logout dovrebbe andare a /. Ma nel mio caso al logout anche il suo reindirizzamento a invalid-session-url quindi ricevo sempre il timeout vero sia per il normale logout che per il timeout della sessione.

Please help me per differenziare questo.

UPDATE

/logout richiesta contiene

session = request.getSession(); 
session.invalidate(); 
session = null; 
+0

'invalid-session-url' quando non si invalidare la sessione correttamente, può mostrare come si invalidare sessione? – FreezY

+0

Nel web.xml qual è la pagina predefinita specificata all'avvio dell'applicazione? –

+0

Non ho specificato nulla..per "/" url ho caricato la pagina di login –

risposta

5

Ho risolto! scrivendo un filtro invece in base alla sicurezza Spring.

Se qualcuno è interessato si può utilizzare il codice qui sotto: -

import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.text.MessageFormat; 

import javax.servlet.FilterChain; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.log4j.Logger; 
import org.springframework.web.filter.OncePerRequestFilter; 

public class FilterToGetTimeOut extends OncePerRequestFilter { 

    @Override 
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException { 
     try { 
      if(request.getRequestURI().equals("/") || request.getRequestURI().equals("/Login/")){ 
       if(request.getSession().getAttribute("login") != null && (Boolean)request.getSession().getAttribute("login") == true){ 
        response.sendRedirect(URL);  //After login page 
       } 
      } else if(request.getSession().getAttribute("login") == null && !request.getRequestURI().equals("/LogOut")){ 
       response.sendRedirect(request.getContextPath()+"/?timeout=true"); //If timeout is true send session timeout error message to JSP 
      } 
      filterChain.doFilter(request, response); 
     } catch (Exception e) { 
      //Log Exception 

     } 
    } 
} 

Aggiungi questo filtro nel web.xml.

<filter> 
     <filter-name>FilterToGetTimeOut </filter-name> 
     <filter-class>package.FilterToGetTimeOut </filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>FilterToGetTimeOut</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Così ora sessione invalida anche e posso gestire il timeout della sessione troppo.

+0

Qual è l'URL var nello snippet "Dopo la pagina di accesso"? – Hector

+0

Non ti ho preso .... dov'è lo snippet 'after login page'? –

+0

Non capisco Cosa fa questa linea? response.sendRedirect (URL) – Hector

3

vi consiglio il logout utilizzando questo:

HttpSession session= request.getSession(false); 
    SecurityContextHolder.clearContext(); 
     if(session != null) { 
      session.invalidate(); 
     } 
     for(Cookie cookie : request.getCookies()) { 
      cookie.setMaxAge(0); 
     } 
+0

ho provato con la tua risposta, non riesco a ottenere il timeout della sessione sempre –

+0

"expired-url' è per sessione scaduta che significa se l'app rileva utente con più di 'max-sessions' che in questo caso più di 1 sessione, quindi molla reindirizzerà a 'expired-url'. La mia risposta è di assicurarmi che il tuo logout non vada a 'invalid-session-url'. Se vuoi fare un timeout che registra automaticamente l'utente dopo un certo periodo di tempo, puoi usare jquery. – FreezY

+0

Effettivamente al logout se rimuovo session.invalidate anche lo stesso sta andando allo stesso –

0

Nel tuo caso ciò che accade è quando un logout utente, la sessione è prima invalidato, quindi la gestione delle sessioni verrà attivata. Quando la sessione di gestione entra e scopre che la sessione è già finita, la pagina sessionTimeout verrà reindirizzata. Quindi sarà meglio impostare la sessione invalidate del tag di logout come falso.

<logout logout-success-url="/" invalidate-session="false" logout-url="/LogOut"/> 
+0

dopo aver menzionato invalidate-session = 'false' anche per il logout il suo reindirizzamento all'invalidate-url –

0

Si prega di definire la mappatura delle richieste per l'url logout-successo nel controller e da lì reindirizzare alla pagina iniziale. per esempio sostituire la mappatura come sotto

<http auto-config="true" use-expressions="true"> 
<logout logout-success-url="/logoutSucess" invalidate-session="true" logout-url="/LogOut"/> 
<form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/> 
<session-management invalid-session-url="/?timeout=true"> 
    <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" /> 
</session-management> 

definire questo/logoutSucess in con @RequestMapping (valore = "/ logoutSucess" method = RequestMethod.GET)

0

ho avuto problema simile, come

  1. Se il login con qualche utente dire zzzz
  2. Hai chiuso il browser
  3. Anche in questo caso si sta cercando di effettuare il login con lo stesso utente zzzz
  4. Non è riuscito ad accedere con il messaggio per la sessione massima superata

Il codice che ho sul mio file di sicurezza di primavera è:

<session-management invalid-session-url="/?timeout=true"> 
<concurrency-control max-sessions="1" expired-url="/logout?timeout" /> 

Ho risolto questo problema aggiungendo la voce sessione di timeout in file web.xml. Inserisco il valore di timeout della sessione come 5 minuti, compilo l'applicazione e la schierò. È funzionante.

Potrebbe essere questo aiuterà qualcuno.

Grazie, Atul

innesco
Problemi correlati