Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 无cookie的Scalatra会话_Session_Scala_Scalatra - Fatal编程技术网

Session 无cookie的Scalatra会话

Session 无cookie的Scalatra会话,session,scala,scalatra,Session,Scala,Scalatra,我正在使用Scalatra框架构建一个web应用程序。 应用程序依赖于会话,但我不能使用会话cookie(因为技术上只有一个用户,同时运行多个会话) 每个会话都有一个唯一的会话密钥,我想将其用作标识符。我希望此密钥作为GET或POST参数而不是cookie头发送 我现在的问题是:如果没有cookie,而仅仅是一个参数作为标识符,如何在Scalatra servlet中存储会话信息(即状态) 到目前为止,我尝试使用文件系统来存储所有会话信息,但这太慢,而且没有必要,因为会话只持续几秒钟 (安全不是

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

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

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

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

(安全不是问题)

问得好

与其将状态存储到磁盘以及由此带来的性能损失,不如将la Redis存储在内存中

在Scala社区有一个很重的debasishg,这可能符合要求


例如,在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环境时存储“会话数据”的快速、简单的默认解决方案——这正是我所寻找的。您将如何获得密钥?是否会为每个请求生成它?它是如何识别会话的?在我的例子中,密钥是使用代码中其他地方的随机数生成器为每个新会话(不是每个请求)生成的。可以使用任何唯一的标识符。如果会话因超时而无效,该怎么办?您是否运行一些计划任务来检查长时间未使用的会话?在我的例子中,我有一个单独的线程,它会定期删除旧会话(我的会话密钥以时间戳开头,这样我就可以知道它们有多旧),但可能有更好的方法来执行此操作。