/
SkinnyHttpSession.scala
51 lines (37 loc) · 1.89 KB
/
SkinnyHttpSession.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package skinny.session
import skinny.session.jdbc.SkinnySession
import javax.servlet.http.HttpServletRequest
import skinny.filter.SkinnySessionFilter
import grizzled.slf4j.Logging
import skinny.controller.feature.RequestScopeFeature
/**
* SkinnySession works as a shared session for multiple servers.
*/
trait SkinnyHttpSession {
def getAttributeOrElseUpdate(name: String, default: Any): Any
def getAttribute(name: String): Option[Any]
def setAttribute(name: String, value: Any): Unit
def removeAttribute(name: String): Unit
def save(): Unit
def invalidate(): Unit
}
object SkinnyHttpSession extends Logging {
def getOrCreate(request: HttpServletRequest): SkinnyHttpSession = {
val jsessionIdCookieName = request.getServletContext.getSessionCookieConfig.getName
val jsessionIdInCookie = request.getCookies.find(_.getName == jsessionIdCookieName).map(_.getValue)
val jsessionIdInSession = request.getSession.getId
logger.debug(s"[Skinny Session] session id (cookie: ${jsessionIdInCookie}, local session: ${jsessionIdInSession})")
val expireAt = SkinnySession.getExpireAtFromMaxInactiveInterval(request.getSession.getMaxInactiveInterval)
val skinnySession = if (jsessionIdInCookie.isDefined && jsessionIdInCookie.get != jsessionIdInSession) {
SkinnySession.findOrCreate(jsessionIdInCookie.get, Option(jsessionIdInSession), expireAt)
} else {
SkinnySession.findOrCreate(jsessionIdInSession, None, expireAt)
}
val skinnySessionWrapper = new SkinnyHttpSessionJDBCImpl(request.getSession, skinnySession)
logger.debug("[Skinny Session] " +
s"initial attributes: ${skinnySession.attributeNames.map(name => s"$name -> ${skinnySession.getAttribute(name)}")}")
val requestScope = RequestScopeFeature.requestScope(request)
requestScope += (SkinnySessionFilter.ATTR_SKINNY_SESSION_IN_REQUEST_SCOPE -> skinnySessionWrapper)
skinnySessionWrapper
}
}