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

时间:2015-08-24 17:53:41

标签: xpages

我刚刚遇到了一个我无法修复的奇怪的JAVA问题。

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

查询被调用两次。一旦使用currentUser id,然后使用SessionAsSigner检索文档,currentUser因读取器字段而无法读取。

以下是我的观察:似乎第一次检索会话(asSigner或currentSession)时,此会话将是您可以在此线程中使用的唯一会话。一旦调用另一个方法,它仍然是currentSession或asSigner会话。

我尝试重新编写会话,编写只携带会话的2个bean,编写两个JAVA类,每个类托管不同的会话,结果始终相同。初始化的第一个会话是您可以获得的唯一会话。要检索我已经使用ExtLib类,DomUtils和VariableResolver的会话,但无论我如何获得会话,它似乎总是相同的问题。

这是一个小例子,我得到的结果是:

示例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

示例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

所以无论我做什么,第二次通话总是错的,因为那个问题。 有谁知道我能做些什么。

2 个答案:

答案 0 :(得分:4)

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

本问题SessionAsSigner - database object conflicts概述了一个。

另一个可能与你如何获得相关数据库有关?在获得另一个会话后,getCurrentDatabase()无法与sessionAsSigner一起使用。您需要第二次使用getDatabase()。

为了获得sessionAsSigner,我建议使用ExtLibUtil.getCurrentSessionAsSigner()。重新发明轮子毫无意义。

另外,请勿回收session。回收任何Domino对象都会回收所有后代。因此,您基本上回收了在请求周期中创建但未在其他位置发布的任何Domino引用。它可能会产生一些奇怪的影响,这些影响很难确定。在循环之外回收任何东西的唯一时间就像Sven对第一个问题的回答所述。

答案 1 :(得分:2)

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

尽管我使用getDatabase作为一种方法,但在使用后我必须回收数据库对象。看起来没有回收它仍然保持会话到数据库,我不能得到sessionAsSigner会话。

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