2016-11-03 39 views
0

私は、ログインの成功の後、コントローラの方法でsessionオブジェクトに値を設定します。セッションが期限切れであることを知るには?

@RequestMapping(value = "/", method = RequestMethod.POST) 
    public ModelAndView processLogin(Model model, HttpServletRequest request, HttpSession session, @RequestParam String login, @RequestParam String pwd) { 

     if (utilisateurDao.verifierLoginUser(login)) { 

      if (utilisateurDao.verifierUser(login, pwd)) { 

       HashMap<String, String> criteres = new HashMap<String, String>(); 
       criteres.put("user_login", login); 
       criteres.put("user_passwd", pwd); 
       List<Utilisateur> users = utilisateurDao.lireParCritere(criteres); 
       session.setAttribute("user_code", ((Utilisateur)users.get(0)).getUser_code()); 

       session.setAttribute("menu", menuDao.afficherMenuParUtilisateur((Integer)session.getAttribute("user_code"), env, request, session)); 

       criteres.clear(); 
       users.clear(); 

       criteres.put("user_code", String.valueOf(session.getAttribute("user_code"))); 
       users = utilisateurDao.lireParCritere(criteres); 
       session.setAttribute("user_names", ((Utilisateur)users.get(0)).getNoms()); 

       session.setAttribute("logout_menu", env.getProperty("menu.logout")); 

       return new ModelAndView("redirect:/accueil"); 

      } else { 

       ModelAndView modelViewLogin = new ModelAndView("redirect:/"); 

       modelViewLogin.addObject("e", "p").addObject("l", login); 

       return modelViewLogin; 

      } 

     } else { 

      ModelAndView modelViewLogin = new ModelAndView("redirect:/"); 

      modelViewLogin.addObject("e", "l"); 

      return modelViewLogin; 

     } 

    } 

は、その後、私はいくつかの分間非アクティブなアプリを開きました。その後、私は "accueil"の道に行きました。その後、メニューは表示されなくなりました。メニューはsessionです。だから、sessionが期限切れであり、それをテストする便利な場所はどこですか?

答えて

3

デフォルトでは、春のセキュリティセッションはSessionRegistryに格納されます。

SecurityContextを使用すると、コントローラコードでこの情報を取得できます。

SecurityContext context = SecurityContextHolder.getContext(); 
    Authentication authentication = context.getAuthentication(); 

セッションの有効期限が切れているか人はあなたが常にSessionDestroyedEventにリスナーを登録することができますログアウト時に通知されるようにしたい場合 - documentation

例:その主題のためspring docsを参照する価値も

@Component 
    public class LogoutListener implements ApplicationListener<SessionDestroyedEvent> { 

     @Override 
     public void onApplicationEvent(SessionDestroyedEvent event) { 
      //do your stuff here 
     } 
    } 

その。あなたはインターセプタを作ることができます

+0

ここで、このクラスのLogoutListenerをインスタンス化する必要がありますか? – pheromix

+0

これをSpringコンテキストのコンポーネントとして追加するだけです。同様の方法で、他のサービスやコントローラを追加しています。 – RMachnik

0

、あなたはHttpServletRequestの を制御し、objがそれらに存在するかどうかを確認してから、新しいSessionExpiredExceptionに投げると@ExceptionMapperでキャッチすることができ、このインターセプタで

@Component 
public class RequestInterceptor extends HandlerInterceptorAdapter 

https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

@Override 
public boolean preHandle(HttpServletRequest request, 
     HttpServletResponse response, Object handler) throws Exception { 
    if (request.getSession().getAttribute("user")==null) { 
     throw new SessionExpiredException(); 
    } 
     return true; 
    } 
0

以下のようにチェックします。私はそれが助けになるかもしれないと思う。

public boolean isUserLoggedIn(HttpServletRequest request) throws IOException { 
    SecurityContext securityContext = (SecurityContext) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT"); 
    if(securityContext != null) { 
     Authentication authentication = securityContext.getAuthentication(); 
     if(null != authentication && authentication.isAuthenticated() != true) 
      return false; 
     else 
      return true; 
    } else { 
     return false; 
    } 
} 
関連する問題