我编写了一个会话范围的托管 bean 来缓存 domino xpages 应用程序中的会话用户特定信息,就像以下代码一样:
public class NBUserInfo {
private String fullUserName;
private String commonUserName;
private String displayName;
private String mailAddress;
private String themeType;
private String themeData;
private Session _session;
private Database _dbnames;
private Name _dominoName;
public NBUserInfo(){
System.out.println("初始化Managed Bean:NBUserInfo...");
_session = ExtLibUtil.getCurrentSession();
try {
System.out.println(_session.getEffectiveUserName());
_dbnames = _session.getDatabase(_session.getCurrentDatabase().getServer(), "names.nsf",false);
_dominoName = _session.createName(_session.getEffectiveUserName());
} catch (NotesException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public String getFullUserName() {
if(fullUserName==null)
try {
fullUserName = _dominoName.getCanonical();
} catch (NotesException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return fullUserName;
}
然后,我在 faces-config 中声明它,使其成为会话范围的 bean:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<!--注册受管Beans-->
<managed-bean>
<managed-bean-name>NBUser</managed-bean-name>
<managed-bean-class>com.nbhdtech.common.NBUserInfo</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<!--注册自定义XPAGES根渲染器-->
<render-kit>
<renderer>
<component-family>javax.faces.ViewRoot</component-family>
<renderer-type>com.ibm.xsp.ViewRootEx</renderer-type>
<renderer-class>com.nbhdtech.xsp.CustomViewRootRenderer</renderer-class>
</renderer>
</render-kit>
<!--AUTOGEN-START-BUILDER:由 IBM Domino Designer 自动生成。请勿修改。-->
<!--AUTOGEN-END-BUILDER:自动生成的区段的末尾-->
</faces-config>
在测试bean时,我通过#{NBUser.fullUserName}使用它,
它并不总是返回当前domino http会话上下文的用户,例如,我首先由用户“user1”登录并注销,然后由user2登录,该bean似乎没有为新的user2会话重新创建,只是仍然是 user1 的会话信息。
有一些解决办法吗?我的 domino 已配置为 LTPAToken SSO 配置。如果有任何答案,非常感谢
正如 Mark Leusink 提到的,XPages 中的 sessionScope 链接到浏览器会话,而不是(登录的)用户会话。
因此,您需要一种方法来检查当前用户是否与绑定到您的用户 bean 的用户匹配。实现此目的的一种方法是在每个请求上调用用户 bean 中的“验证”方法。 “验证”方法可能如下所示:
public void verify() {
// retrieve the username of the current user
String currentUser = ExtLibUtil.getCurrentSession().getEffectiveUserName();
// (re-)init the user bean if another user logged in
if (!currentUser.equals(getFullUserName())) {
// Call your constructor logic here
}
}
您可以在中调用此“验证”方法beforePageLoad
中央自定义控件之一的事件(例如布局的自定义控件):
<xp:this.beforePageLoad><![CDATA[#{javascript:
// (re-)init the userbean if another user logged in
NBUser.verify();
}]]></xp:this.beforePageLoad>
--
另外,您不应该将 Domino 特定对象存储在 bean 中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)