5

我正在使用 Scalatra 框架来构建 Web 应用程序。该应用程序依赖于会话,但我不能使用会话 cookie(因为从技术上讲,只有一个用户,同时运行多个会话)。

每个会话都有一个唯一的会话密钥,我想将其用作标识符。我希望将此密钥作为 GET 或 POST 参数而不是 cookie 标头发送。

我现在的问题是:如何在没有 cookie 而只是作为标识符的参数的 Scalatra servlet 中存储会话信息(即状态)?

到目前为止,我尝试使用文件系统来存储所有会话信息,但这太慢且没有必要,因为会话仅持续几秒钟。

(安全不是问题)

4

2 回答 2

5

我想出了我该怎么做。

在每个 Scalatra servlet 中,我都可以访问servletContext实现javax.servlet.ServletContext接口的全局。我可以使用它的两种方法setAttribute(x: String, y: Any)getAttribute(x : String)存储关于我的会话的信息,其中 x 是我的唯一标识符,y 是编码为 case class 的会话信息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。

于 2012-04-25T18:18:13.227 回答
1

好问题。

与其将状态存储到磁盘和由此带来的性能损失,不如将 Redis 存储在内存中怎么样?

debasishg有一个Scala 实现,它是 Scala 社区中的一个重量级人物,它可能符合要求。

在栅栏的无状态方面,例如在 Spray 中,这被建议作为维护状态服务器端的替代方法;即将客户端cookie标识符存储到内存缓存与依赖HttpSession

于 2012-04-19T09:10:49.120 回答