我有一个从view
提交的表单,在处理我检查角色的表单之前,如果一切正常,那么我insert/edit/delete/approve
数据取决于按下哪个提交按钮,如下所示:
def input_form = withAccess { username => implicit request =>
submitSOForm.bindFromRequest.fold (
hasErrors = { form =>
....
)},
success = { userData =>
if (Sales_Order.check(userData,"insert")) {
//using cache to pass the userData
Cache.set("userData", userData, 60)
if(request.body.asFormUrlEncoded.get("action")(0) == "Save" || request.body.asFormUrlEncoded.get("action")(0) == "Ask for Approval")
Redirect(routes.SalesOrders.insert(request.body.asFormUrlEncoded.get("action")(0)))
else
Redirect(routes.SalesOrders.approval("insert", request.body.asFormUrlEncoded.get("action")(0)))
}
else
Redirect(routes.SalesOrders.index).withSession(Security.username -> username, "timestamp" -> System.currentTimeMillis.toString).flashing(Flash() + ("invalid" -> "Inconsistent Input Data.") + ("insert" -> "block"))
}
)
}
一切正常,我可以在插入或批准操作方法中获取userData
。但是,我不确定使用缓存是正确的选择。我想如果input_form
有很多请求,那么它将从缓存中删除任意数据,这在documentary中有解释。
An important point about the cache is that it behaves just like a cache should:
the data you just stored may just go missing.
那么,我在这里问的是,有没有更好的方法来传递userData
而不使用Cache
?
答案 0 :(得分:2)
首先是:您不需要担心请求之间的缓存松散 - 它不是您不应该将其用作常规持久层。
对于主要问题:最有可能Flash scope将是更适合此任务的解决方案。
请记住缓存值可供其他用户使用,因此如果某个用户几乎在同一时间(60秒)内执行类似的操作,它将从其他操作中获取值 - Flash将其存储在cookie将是个人的。
如果你想留下缓存 - (即如果你想存储远大于4kb的对象)至少要确保缓存键包含一些用户特定的,独特的元素,比如:
Cache.set("userData"+currentUser.id, userData, 60)