2014-04-25 39 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