【发布时间】:2013-07-08 22:53:22
【问题描述】:
我有一个自定义控件放置在我网站的选定页面上。控件的页面加载前事件调用 java 代码检查用户密码是否在 eDirectory 中过期。如果密码过期,自定义控件会将用户重定向到密码更改屏幕,用户可以在其中更改密码。使用范围变量,实际检查每个会话只运行一次。
在 IE 中一切正常。在 FireFox 中,正确检测到过期密码并正确显示密码更改屏幕。但是,如果用户试图返回触发密码更改的页面,那么他们将被带到密码更改屏幕。
似乎是浏览器将他们引导到密码更改屏幕,因为当 java 代码运行时,我将大量诊断消息打印到日志中。无论我尝试转到请求的页面多少次,我都只会在日志中看到密码的初始检查。在理论上,每次我被带到该页面时,我都应该在日志中看到多个条目。
只要页面从未触发密码更改,我就可以毫无问题地访问该页面。但如果它确实触发了更改,那么我将无法再转到该页面,因为它将带我进入密码更改屏幕。
如果我清除 FirFox 中的缓存,那么在下一次更改密码之前一切正常。
让这个问题更令人沮丧的是,它似乎只发生在我们的反向代理服务器上。我们有一个 apacahe 反向代理,允许外部浏览器访问我们的网站。反向代理服务器连接到负载平衡器服务器,并连接到两个 Domonio 服务器之一。
知道如何解决这个非常奇怪的缓存问题吗?
这是在页面加载前事件中运行的代码。
var pwdExpired:boolean = sessionScope.get("pwdExpired");
if (pwdExpired == null)
{
var ldap:com.pnc.cld.LDAPauthentication = new com.pnc.cld.LDAPauthentication();
if (ldap.isPasswordExpired(@Name("[CN]",@UserName())))
{
sessionScope.put("pwdExpired",true);
var extCont = facesContext.getExternalContext();
extCont.redirect(getURI("xp_pgChangePwd.xsp"));
}
else
sessionScope.put("pwdExpired",false);
}
【问题讨论】:
-
在 Firefox 中似乎有很多奇怪的问题。我之前有一个关于stackoverflow.com/questions/16610593/… 的问题,也许它也与那里的缓存有关,即使它不应该保留超时变量。
-
当用户更改密码时,您是否将 sessionScope 变量设置为 null?对我来说似乎是逻辑错误。考虑将变量更改为 viewScope。
-
您要向 XPage 添加哪些 http 标头/元标记?
-
您是否尝试过设置 HTTP Header Cache-Control: no-cache, no-store?
-
@Arron - 我将 sessionScope 设置为 true 或 false,具体取决于 pw 是否过期。如果更新成功,我也将其设置为 false。如果 pwdExpired 为空,我只会去 ldap。我不能使用 viewScope 变量。那没有任何意义。那我还不如根本不用。
标签: xpages xpages-ssjs