0

我正在爲我的Web應用程序使用Play Framework 2.5。如何在每次用戶登錄時生成不同的會話ID

在我的應用程序中,當提供的creadentioal有效時,服務器端應用程序會生成一個會話ID並將其放入電子郵件地址,以便應用程序可以判斷所請求的用戶已被登錄或不使用會話ID。

重定向(routes.Application.index).withSession( 「電子郵件」 - > 「XXX」)

服務器端應用程序還刺耳會話當用戶註銷。

重定向(routes.Application.index).withSession

我檢查會話ID。即使關閉瀏覽器,會話ID也始終保持不變。

  1. 登錄

    PLAY_SESSION = 0b3fbd59f215c5df4dd937b508ef7cce42b65c56-電子郵件= PF%40ex

  2. 重載

    PLAY_SESSION = 0b3fbd59f215c5df4dd937b508ef7cce42b65c56-電子郵件= PF%40ex

  3. 註銷

  4. 登錄

    PLAY_SESSION = 0b3fbd59f215c5df4dd937b508ef7cce42b65c56電子郵件= PF%40ex

  5. 關閉瀏覽器

  6. 登錄

    PLAY_SESSION = 0b3fbd59f215c5df4dd937b508ef7cce42b65c56電子郵件= PF%40ex

attcher很容易猜測每個帳戶的會話ID 。所以我想在每次登錄帳戶時都生成不同的會話ID。我怎樣才能做到這一點?

感謝。

回答

1

Docs

By default, there is no technical timeout for the Session. It expires when the user closes the web browser. 

我猜你沒有關閉瀏覽器,會話保持不變,您登錄後再次。

所以,退出的時候,你可以放棄使用withNewSession和登錄過程中舊的會話,創建一個使用withSession

+0

服務器端應用程序顯示一個登錄頁面後,我關閉瀏覽器或註銷(調用內部withNewSession)。所以,這兩種情況下的會話ID都會過期。但我的問題是,每次生成會話標識時都會出現相同的會話標識,這是「0b3fbd59f215c5df4dd937b508ef7cce42b65c56-email = pf%40ex」在我的情況/ – Yohei

+0

@Yohei,你有沒有想出一個解決方案? – Zennichimaro

0

隨着redis幫助一個新的會話,就可以生成隨機會話ID時,在每次用戶登錄。

這意味着您將丟棄播放會話,而不是使用自己的redis管理用戶會話。

每次用戶登錄時,都可以爲用戶生成會話ID並在redis中恢復它並設置會話過期時間。當用戶請求進來時,您可以檢查請求中的隨機會話ID。

更新 當用戶登錄時,您的後端服務器可以爲用戶生成randomId,並將隨機ID放入會話中。當用戶註銷時,刪除隨機ID。該代碼是類似於以下

class Application extends Controller { 

    def login() { implicit request => 
     val canLogin: Boolean = // check the authority,such as secret code 
     if (canLogin) { 
      val loginRandomId = Random.alphanumeric // just an example, generate randomID as you want 
      //put key-value into redis. Maybe (loginRandomId, email) is what you want, and you can also set expiredate for the key 
      redis.set(loginRandomId, email) 
      Redirect(routes.Application.index).withSession("email" -> loginRandomId) 
     } 
    } 

    def index() { implicit request => 
     val sessionValue = request.session.get("email");// sessionValue is randomId 
     val isExist = redis.exit(sessionValue) 
     if (isExist) { 
      //handle the request 
     } else { 
      // did not login, return 
     } 
    } 
    def logout() { implicit request => 
     // when logout you should delete the key in redis 
     val sessionValue = request.session.get("email"); 
     redis.delete(sessionValue) 
    } 
} 

好運

+0

你能解釋更多關於detais嗎?通過使用Session,你的會話ID是什麼?你如何驗證會話ID是否有效? – Yohei

+0

你能提供一個鏈接到'redis'庫嗎? – Zennichimaro

+0

@Zennichimaro Jedis,你可以從maven中獲得它 – Jerry