Play Framework - 使用Cache将参数传递给控制器​​中另一个动作的动作

时间:2014-07-15 04:51:48

标签: scala caching controller playframework-2.2

我有一个从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

1 个答案:

答案 0 :(得分:2)

首先是:您不需要担心请求之间的缓存松散 - 它不是您不应该将其用作常规持久层。

对于主要问题:最有可能Flash scope将是更适合此任务的解决方案。

请记住缓存值可供其他用户使用,因此如果某个用户几乎在同一时间(60秒)内执行类似的操作,它将从其他操作中获取值 - Flash将其存储在cookie将是个人的。

如果你想留下缓存 - (即如果你想存储远大于4kb的对象)至少要确保缓存包含一些用户特定的,独特的元素,比如:

Cache.set("userData"+currentUser.id, userData, 60)