2012-04-19 84 views
5

我正在使用Scalatra框架來構建一個Web應用程序。 應用程序依賴於會話,但我不能使用會話cookie(因爲技術上只有一個用戶同時運行多個會話)。沒有cookies的Scalatra會話

每個會話都有一個唯一的會話密鑰,我想用它作爲標識符。我希望此密鑰作爲GET或POST參數而不是cookie標頭髮送。

我現在的問題是:如何將會話信息(即狀態)存儲在Scalatra servlet中而不使用cookie,而只是一個參數作爲標識符?

到目前爲止,我試圖使用文件系統來存儲所有的會話信息,但這太慢了,不必要,因爲會話只持續幾秒鐘。

(安全不是問題)

回答

5

我想出瞭如何做到這一點。

在每個Scalatra servlet中,我可以訪問實現javax.servlet.ServletContext接口的全局servletContext。我可以使用它的兩種方法setAttribute(x: String, y: Any)getAttribute(x : String)來存儲有關我的會話的信息,其中x是我的唯一標識符,y是會話信息,編碼爲案例類Session

切實我具備以下條件:

def storeSession(key : String, session : Session) { 
    servletContext.setAttribute(attributePrefix + key, session) 
} 

def loadSession(key : String) : Session = { 
    val session = servletContext.getAttribute(attributePrefix + key) 
    if (session != null) { 
     session match { 
      case s : Session => s 
      case _ => null 
     } 
    } else { 
     null 
    } 
} 

這樣我可以保持狀態的服務器上,無需通過cookie,僅客戶端必須提供一個GET值一個唯一的標識符。

我想這個技術可以應用於Java和Scala中的任何servlet,它提供了一個ServletContext的實例,而不僅僅是Scalatra。

+0

這是處理Java servlet環境時用於存儲「會話數據」的quick-n-easy和默認解決方案 - 正是我所需要的。 – 2013-06-20 00:39:31

+0

你將如何獲得鑰匙?它會爲每個請求生成嗎?它如何識別會話? – Rajeev 2013-12-24 10:53:24

+0

在我的情況下,在每個新會話中(而不是每個請求)使用隨機數生成器在代碼中的其他位置生成密鑰。任何唯一的標識符都可以使用。 – Waboodoo 2013-12-24 13:29:30

1

不錯的問題。

與其將狀態存儲到磁盤以及引起性能下降,如何在內存中存儲la Redis?

debasishg有一個Scala implementation,它是Scala社區中的一員,它可能適合該賬單。例如,在Spray中,我認爲這是在維護狀態服務器端的替代方法;即將客戶端cookie標識符存儲到內存中高速緩存,而不是依靠HttpSession