【发布时间】:2016-09-05 00:59:09
【问题描述】:
从前,有一位年轻的绅士阅读了一些教程、一些文档、一些 StackOverflow 问题,甚至可能会问一两个问题。在他这样做之后,他认为他对事情的运作方式有了一个公平的把握,并着手构建他想要的功能,并且它奏效了!直到邪恶的女巫出现并尝试使用没有魔法 cookie 的不同浏览器时,他意识到 UserIdentity 已在用户之间持续存在......这并不好。
来自戏剧! docs(Guice 文档说类似)
每次需要组件时都会创建新实例。如果一个组件被多次使用,那么默认情况下,将创建该组件的多个实例。如果您只想要组件的单个实例,则需要将其标记为单例。
我的IndexController 类的顶部(我的假设是每个请求调用一次索引操作,因此请求一个新的UserIdentity——这是错误的吗?)
@Singleton
class IndexController @Inject() (contentModel: ContentModel, site: Site, injector: Injector) extends Controller {
def index(url: String, page: Int = 1, sort: String, dir: Int) = Action.async { implicit request =>
implicit val queryString : QueryString = request.queryString
val userIdentityClass = injector.getInstance(classOf[UserIdentity])
implicit val userIdentity : Future[UserIdentity] = userIdentityClass.getUserIdentity
doContent(url, page, sort, dir) fallbackTo doAlias(url) fallbackTo do404(url)
}
userIdentity 然后隐式传递到机器的内部。
getUserIdentity 方法调用进行身份验证的getUser 方法,并设置user : UserModel 属性。这一切都在未来传递,因此当我们稍后在应用程序中使用 userIdentity 时,我们可以映射它,以便我们知道身份验证已完成。
这是 get user 方法和为未经身份验证的用户调用的 println。
private def getUser(implicit request:Request[AnyContent]) : Future[UserModel] = {
if (user != null) {
println("User already set")
Future { user }
} else {
//Go and find the user from cookie/some other auth stuff
注意 var user : UserModel = null 在 UserIdentity 类上,所以它应该是 null 在新实例上。
【问题讨论】:
标签: scala playframework guice implicit playframework-2.5