Jetty 电梯/码头的绝对会话超时

Jetty 电梯/码头的绝对会话超时,jetty,lift,session-timeout,Jetty,Lift,Session Timeout,在Jetty下运行的Lift应用程序中实现绝对会话超时的好方法是什么 我已经有一个空闲超时,但我希望会话最终超时,即使用户从不空闲。我会使用Lifts feautures从头开始构建您想要的内容。一些想法如下: 使用SessionVar,内部带有timeoutstore(见下文) 将此存储定义为如下内容: class TimeoutStorage[T] { private var inner: Option[(T, Long)] = None // the last argument i

在Jetty下运行的Lift应用程序中实现绝对会话超时的好方法是什么


我已经有一个空闲超时,但我希望会话最终超时,即使用户从不空闲。

我会使用Lifts feautures从头开始构建您想要的内容。一些想法如下:

使用
SessionVar
,内部带有timeoutstore(见下文)

将此存储定义为如下内容:

class TimeoutStorage[T] {
    private var inner: Option[(T, Long)] = None // the last argument is when the data was set
    def set {} // set the value. If you want to clear the memory as fast as possible, schedule an erase. Otherwise it would be erased with the `SessionVar` anyway.
    def get{} // check if it has expired
}

如果你想给用户一个视觉上的超时时间——添加一个像@jcern这样的参与者。或者只是
net.liftweb.util.Schedule
一个小函数,它将向浏览器发送一个JS(这必须是可能的,但要小心,不要让合适的
net.liftweb.http.S
在范围内)。

首先:您应该注意在活动组件运行时破坏会话的影响(与comet actors、ajax请求等类似)。但您可以创建一个客户端脚本,一旦它检测到会话无效,就可以重定向到您的客户端的开始/警告页面。
LiftRules.nocomeSessionCmd
LiftRules.noAjaxSessionCmd
就是您的朋友

现在:您想利用lift的SessionMaster.sessionCheckFuncs为您提供的机制。它每10秒运行一次此方法并为您提供所有当前有效的会话。决不!存储对会话本身的引用。这就是lift为您提供唯一标识符的原因,我们可以利用它。解决方案基于David Pollack关于在高流量峰值时终止会话的代码,您可以在此处找到:

在Boot.scala中添加:

//将强制会话超时附加到检查函数列表
SessionMaster.sessionCheckFuncs=SessionMaster.sessionCheckFuncs
::列表(强制会话超时)
然后在lib包中:

导入net.liftweb.common_
导入net.liftweb.http.SessionInfo
导入net.liftweb.util.Helpers_
对象强制SessionTimeout扩展
函数2[Map[String,SessionInfo],SessionInfo=>Unit,Unit]
可通行的{
@volatile var sessionTimeoutMillis:Long=30*60*1000//30分钟
private var firstSeen:Map[String,Long]=Map.empty
def apply(sessions:Map[String,SessionInfo],destructor:SessionInfo=>Unit):Unit={
logger.info(“会话检查!”)
val timeoutThreshold=millis-sessionTimeoutMillis
val newFirstSeen:Map[String,Long]=sessions.Map{
案例(名称,si@SessionInfo(会话,代理,cnt,lastAccess))=>
第一次看到。获取(名称)匹配{
案例部分(firstTimeSeen)=>
if(firstTimeSeenfirstTimeSeen
案例无=>
//添加到第一次看到的列表
名称->米利斯
}
}
//更新第一个看到的映射,如果我们在映射中添加了会话,这可以防止泄漏
//但由于另一个原因,lift已经结束了会议
this.firstSeen=newFirstSeen
}
}

是否有特定的内容要完成,或者有一组特定的条件,您希望在会话下进行会话吗?或者,您真的只希望用户在XXX分钟后登录吗?不管用户在做什么的时候,是的,在创建X分钟后终止会话,不管W用户正在做的事情。