会话范围的托管 bean 在 xpages 应用程序中似乎不是会话范围的
session-scoped managed bean appears to be not session scoped in an xpages application
我写了一个会话范围的托管 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}使用了它,
它并不总是 return 当前 domino http 会话上下文的用户,例如,我首先由用户 "user1" 登录并注销,然后由 user2 登录,bean 似乎没有重新创建对于新的 user2 会话,仍然是 user1 的会话信息。
是否有解决此问题的方法?我的多米诺骨牌已配置为 LTPAToken SSO 配置。如果有任何答案,非常感谢
正如 Mark Leusink 所提到的,XPages 中的 sessionScope 链接到浏览器会话而不是(登录的)用户会话。
因此您需要一种方法来检查当前用户是否与绑定到您的用户 bean 的用户相匹配。一种方法是在每次请求时调用用户 bean 中的 "verify" 方法。 "verify" 方法可能如下所示:
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
事件中调用此 "verify" 方法:
<xp:this.beforePageLoad><![CDATA[#{javascript:
// (re-)init the userbean if another user logged in
NBUser.verify();
}]]></xp:this.beforePageLoad>
--
此外,您不应该将 Domino 特定对象存储在 bean 中。
我写了一个会话范围的托管 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}使用了它, 它并不总是 return 当前 domino http 会话上下文的用户,例如,我首先由用户 "user1" 登录并注销,然后由 user2 登录,bean 似乎没有重新创建对于新的 user2 会话,仍然是 user1 的会话信息。
是否有解决此问题的方法?我的多米诺骨牌已配置为 LTPAToken SSO 配置。如果有任何答案,非常感谢
正如 Mark Leusink 所提到的,XPages 中的 sessionScope 链接到浏览器会话而不是(登录的)用户会话。
因此您需要一种方法来检查当前用户是否与绑定到您的用户 bean 的用户相匹配。一种方法是在每次请求时调用用户 bean 中的 "verify" 方法。 "verify" 方法可能如下所示:
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
事件中调用此 "verify" 方法:
<xp:this.beforePageLoad><![CDATA[#{javascript:
// (re-)init the userbean if another user logged in
NBUser.verify();
}]]></xp:this.beforePageLoad>
--
此外,您不应该将 Domino 特定对象存储在 bean 中。