2014-04-25 41 views

回答

11

当使用Play的built-in authentication时,在每个经过验证的请求中,都会在会话中存储具有更新过期时间戳的时间戳。

然后,在验证器中,验证会话到期。

文章How to implement a Session Timeout in Play Framework 2提供这个例子:

public class Secured extends Security.Authenticator { 

    public static final String UNAUTHENTICATED = "unauthenticated"; 

    public static User getLoggedInUser() { 
     if (session("userId") == null) 
      return null; 
     return User.findById(Long.parseLong(session("userId"))); 
    } 

    public static String getLoggedInUsername() { 
     if (session("userId") == null) 
      return null; 
     return User.findById(Long.parseLong(session("userId"))).getUsername(); 
    } 


    @Override 
    public String getUsername(Http.Context ctx) { 

     // see if user is logged in 
     if (session("userId") == null) 
      return null; 

     // see if the session is expired 
     String previousTick = session("userTime"); 
     if (previousTick != null && !previousTick.equals("")) { 
      long previousT = Long.valueOf(previousTick); 
      long currentT = new Date().getTime(); 
      long timeout = Long.valueOf(Play.application().configuration().getString("sessionTimeout")) * 1000 * 60; 
      if ((currentT - previousT) > timeout) { 
       // session expired 
       session().clear(); 
       return null; 
      } 
     } 

     // update time in session 
     String tickString = Long.toString(new Date().getTime()); 
     session("userTime", tickString); 

     return User.findById(Long.parseLong(session("userId"))).getUsername(); 
    } 
} 

这需要在应用程序的配置文件(application.conf)以分钟为sessionTimeout值。

+0

对不起,迟交的回复,我会尽快回复,看看这是否有效。非常感激。 – supertonsky

+0

我建议在'getUsername'的主体中使用'ctx.session()。replace(“userTime”,tickString);' – malloc4k

+0

'session(String)'包含什么包? –

0

会话超时

  • 会话超时配置项,session.maxAge,以前是一个整数,定义为以秒。现在它是一个持续时间,所以可以用1h或30m等值来指定。不幸的是,如果没有时间单位指定默认单位是毫秒,这意味着配置值3600以前被视为一个小时,但现在被视为3.6秒。您将需要更新您的配置以添加时间单位。

See here