在XPages应用程序中,我想在 applicationScope 中存储一些(机密)信息,以使所有用户都可以访问它。但是,应用程序的ACL配置为允许匿名用户读取公共(public)文档。仍然,我不希望他们可以访问applicationScope。匿名用户是否可以访问/阅读applicationScope?
最佳答案
所有范围变量(包括applicationScope
)都是内存上下文。在这种情况下,术语“范围”是指可以访问的范围。
在单个HTTP请求期间,当前页面内执行的任何代码均可访问requestScope
,此时该对象将被销毁。其他任何页面以及针对同一页面实例的任何后续请求都具有各自独立的requestScope
。
在该页面实例的整个生命期内,在当前页面内执行的任何代码都可以访问viewScope
。其他页面(包括同一用户访问的页面)具有自己的viewScope
。同样,如果用户导航到另一个页面,然后导航回到上一页,则这是一个新的viewScope
,因为它是该页面的新实例。
在单个HTTP session 中,可以在任何页面内执行的任何代码访问sessionScope
。这与浏览器中的 session cookie相关,而不与身份验证相关。因此,如果以后有匿名用户登录,则仍然是sessionScope
。如果他们以后注销,则在关闭浏览器或应用程序清除存储之前,它们仍然具有相同的sessionScope
。applicationScope
可以由当前应用程序内任何页面中执行的任何代码访问。这就是允许它在用户之间共享的原因:如果User1在同一台NSF中访问一台计算机上的app1.nsf/page1.xsp
,而User2在同一NSF中访问同一页面(或不同页面),则它们具有相同的applicationScope
-变量引用这两个用户的内存对象完全相同-因此,通过一个用户执行的代码存储的任何数据都可以通过另一个用户执行的代码检索,直到应用程序清除存储空间为止。
但,如果User1正在访问app1.nsf
中的任何页面,而User2(或Anonymous)正在访问app2.nsf
中的任何页面,则变量applicationScope
会为每个用户引用不同的内存对象,因为它们正在访问不同的应用程序,即使存在两个应用程序中的代码可访问另一个应用程序中的磁盘数据。每个NSF中applicationScope
变量引用的内存对象都是不同的,无论它可能访问或创建的任何磁盘数据存储在何处。
因此,您(以及其他使用同一NSF编写代码的人)仍然需要勤奋地研究如何构造逻辑,以避免将敏感信息存储在applicationScope
中,然后将其暴露给那些无权访问该信息的用户,但是您没有这样做无需担心从其他访问相同内存范围的应用程序执行的代码。如果代码是从同一NSF执行的,则代码只能读取存储在applicationScope
中的数据。