Session 无cookie的Scalatra会话
我正在使用Scalatra框架构建一个web应用程序。 应用程序依赖于会话,但我不能使用会话cookie(因为技术上只有一个用户,同时运行多个会话) 每个会话都有一个唯一的会话密钥,我想将其用作标识符。我希望此密钥作为GET或POST参数而不是cookie头发送 我现在的问题是:如果没有cookie,而仅仅是一个参数作为标识符,如何在Scalatra servlet中存储会话信息(即状态) 到目前为止,我尝试使用文件系统来存储所有会话信息,但这太慢,而且没有必要,因为会话只持续几秒钟 (安全不是问题)问得好 与其将状态存储到磁盘以及由此带来的性能损失,不如将la Redis存储在内存中 在Scala社区有一个很重的debasishg,这可能符合要求Session 无cookie的Scalatra会话,session,scala,scalatra,Session,Scala,Scalatra,我正在使用Scalatra框架构建一个web应用程序。 应用程序依赖于会话,但我不能使用会话cookie(因为技术上只有一个用户,同时运行多个会话) 每个会话都有一个唯一的会话密钥,我想将其用作标识符。我希望此密钥作为GET或POST参数而不是cookie头发送 我现在的问题是:如果没有cookie,而仅仅是一个参数作为标识符,如何在Scalatra servlet中存储会话信息(即状态) 到目前为止,我尝试使用文件系统来存储所有会话信息,但这太慢,而且没有必要,因为会话只持续几秒钟 (安全不是
例如,在Spray中,在围栏的无状态一侧,有人向我建议将其作为维护服务器端状态的替代方法;i、 e.将客户端cookie标识符存储到内存缓存中,而不是依赖HttpSession,我找到了解决方法 在每个Scalatra servlet中,我都可以访问全局
servletContext
,它实现了javax.servlet.servletContext
接口。我可以使用它的两种方法setAttribute(x:String,y:Any)
和getAttribute(x:String)
来存储有关我的会话的信息,其中x是我的唯一标识符,y是作为case类编码的会话信息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。这是在处理Java servlet环境时存储“会话数据”的快速、简单的默认解决方案——这正是我所寻找的。您将如何获得密钥?是否会为每个请求生成它?它是如何识别会话的?在我的例子中,密钥是使用代码中其他地方的随机数生成器为每个新会话(不是每个请求)生成的。可以使用任何唯一的标识符。如果会话因超时而无效,该怎么办?您是否运行一些计划任务来检查长时间未使用的会话?在我的例子中,我有一个单独的线程,它会定期删除旧会话(我的会话密钥以时间戳开头,这样我就可以知道它们有多旧),但可能有更好的方法来执行此操作。