1

我有一个自定义控件放置在我网站的选定页面上。控件的页面加载前事件调用 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);

}
4

1 回答 1

0

斯文的建议至少似乎解决了这个问题。据报道,该问题也发生在 IE9 中。我不确定这个解决方案是否解决了这个问题,因为我还不能测试它。

这是我解决问题的方法:

var extCont = facesContext.getExternalContext();
var response = extCont.getResponse();

response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
于 2013-07-08T14:53:22.327 回答