Xpages 在同一线程中使用sessionAsSigner和currentSession

Xpages 在同一线程中使用sessionAsSigner和currentSession,xpages,Xpages,我遇到了一个奇怪的JAVA问题,我无法解决 我调用JavaBean从视图中检索一些值。 为此,我调用一个JAVA类来进行查找 查找被调用两次。一次使用currentUser id,然后使用SessionAsSigner检索当前用户由于读卡器字段而无法读取的文档 以下是我的观察:第一次检索会话(赋值器或currentSession)时,该会话将是该线程中唯一可以使用的会话。调用另一个方法后,它仍然是currentSession或asSigner会话 我尝试重新引用会话,编写2个只携带会话的bean

我遇到了一个奇怪的JAVA问题,我无法解决

我调用JavaBean从视图中检索一些值。 为此,我调用一个JAVA类来进行查找

查找被调用两次。一次使用currentUser id,然后使用SessionAsSigner检索当前用户由于读卡器字段而无法读取的文档

以下是我的观察:第一次检索会话(赋值器或currentSession)时,该会话将是该线程中唯一可以使用的会话。调用另一个方法后,它仍然是currentSession或asSigner会话

我尝试重新引用会话,编写2个只携带会话的bean,编写两个JAVA类,每个类承载不同的会话,结果总是一样的。初始化的第一个会话是您可以获得的唯一会话。为了检索会话,我已经使用了ExtLib类、DomUtils和variablesolver,但无论如何获取会话,这似乎总是一个问题

下面是一个小例子和我得到的结果:

例1:

Session s=Util.getCurrentSession()
Vector<String>=result=Util.lookup(s,view,key)
//result is empty because user cant read the documents -OK
Session s=Util.getSessionasSigner()
Vector<String>=result=Util.lookup(s,view,key)
//result is empty although Signer can read document -NOK
会话s=Util.getCurrentSession() Vector=result=Util.lookup(s、视图、键) //结果为空,因为用户无法读取文档-确定 会话s=Util.getSessionasSigner() Vector=result=Util.lookup(s、视图、键) //结果为空,但签名者可以读取文档-NOK 例2

 Session s=Util.getSessionasSigner()
 Vector<String>=result=Util.lookup(s,view,key)
 //result returns the documents -OK
 Session s=Util.getCurrentSession()
 Vector<String>=result=Util.lookup(s,view,key)
 //result again returns the documents allthough the user shouldnt be able to read it -NOK
会话s=Util.getSessionasSigner() Vector=result=Util.lookup(s、视图、键) //结果返回文档-确定 会话s=Util.getCurrentSession() Vector=result=Util.lookup(s、视图、键) //result再次返回所有文档,尽管用户不应该能够读取它-NOK 所以无论我做什么,第二个电话总是错误的,因为这个问题。
有人知道我能做些什么吗。

这里有一些可能的选择,这取决于你的util方法在做什么

一个是在这个问题中概述的

另一个可能与您如何获取相关数据库有关<获取另一个会话后,code>getCurrentDatabase()不能与
sessionAsSigner
一起使用。您需要第二次使用getDatabase()

为了获取sessionAsSigner,我建议使用
ExtLibUtil.getCurrentSessionAsSigner()
。重新发明轮子是没有意义的


另外,不要回收
会话
。回收任何Domino对象都会回收所有子对象。因此,您基本上是在回收任何在请求周期中创建但未在其他地方发布的Domino引用。它可能会产生一些奇怪的影响,很难确定。在循环之外回收任何东西的唯一时间如Sven对第一个链接问题的回答所述。

这里有一些可能的选项,具体取决于您的util方法正在执行的操作

一个是在这个问题中概述的

另一个可能与您如何获取相关数据库有关<获取另一个会话后,code>getCurrentDatabase()不能与
sessionAsSigner
一起使用。您需要第二次使用getDatabase()

为了获取sessionAsSigner,我建议使用
ExtLibUtil.getCurrentSessionAsSigner()
。重新发明轮子是没有意义的


另外,不要回收
会话
。回收任何Domino对象都会回收所有子对象。因此,您基本上是在回收任何在请求周期中创建但未在其他地方发布的Domino引用。它可能会产生一些奇怪的影响,很难确定。在循环之外回收任何东西的唯一时间,正如斯文对第一个链接问题的回答所述。

谢谢保罗,我找到了它。你把我带到了正确的方向

尽管我使用getDatabase作为一种方法,但在使用之后,我必须回收数据库对象。看起来如果没有循环,它仍然会将会话保留到数据库,我无法获得会话分配者会话


在我回收了数据库对象之后,我就能够获得sessionAsSigner会话,它返回了正确的文档。

谢谢Paul,我找到了它。你把我带到了正确的方向

尽管我使用getDatabase作为一种方法,但在使用之后,我必须回收数据库对象。看起来如果没有循环,它仍然会将会话保留到数据库,我无法获得会话分配者会话


回收数据库对象后,我就能够获得sessionAsSigner会话,它返回了正确的文档。

我发现查找方法中存在一些缓存问题。不,这不是缓存问题。在loookup方法中,我确实打印了effectiveusername,并且它总是打印相同的名称,而我希望对于currentuser和我本人(开发人员)来说,用户名应该是匿名的,并带有Assigner。我在查找方法中发现了一些缓存问题。不,这不是缓存问题。在loookup方法中,我确实打印了effectiveusername,并且它总是打印相同的名称,而我希望对于currentuser和我本人(开发人员)来说,用户名应该是匿名的,并使用assignerI使用Extlib和getDatabase,但它不起作用。从util类返回的第一个会话将是您可以使用的唯一会话I used Extlib和getDatabase,但它不起作用。从util类返回的第一个会话将是您可以使用的唯一会话