我有一个自定义控件放在我网站的选定页面上。控件在页面加载事件之前调用java代码,该代码检查用户密码是否在eDirectory中过期。如果密码已过期,则自定义控件会将用户重新调整到密码更改屏幕,用户可以在其中更改其密码。使用范围变量,实际检查每个会话只运行一次。
所有在IE中都很棒。在FireFox中,正确检测到过期的密码,并正确显示密码更改屏幕。但是,如果用户尝试返回触发密码更改的页面,则会将其转到密码更改屏幕。
似乎是指示他们进入密码更改屏幕的浏览器,因为当java代码运行时,我会将大量诊断消息打印到日志中。我只是在日志中看到密码的初始检查,无论我尝试转到请求的页面多少次。在理论上,每当我被带到页面时,我都会在日志中看到多个输入。
只要页面从未触发过密码更改,我就可以毫无问题地转到该页面。但如果它确实触发了更改,那么我就不能再转到该页面,因为它会将我带到密码更改屏幕。
如果我清除FirFox中的缓存,那么所有工作都会很好,直到下一次更改密码。
使这个问题更令人沮丧的原因是它似乎只出现在我们的崇拜代理服务器上。我们有一个apacahe反向代理,允许我们的firwall浏览器访问我们的网站。反向代理服务器连接到负载balanncer服务器,并连接到两个Domonio服务器之一。
我知道如何解决这个非常奇怪的缓存问题吗?
以下是在Before Page Load事件中运行的代码。
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);
}
答案 0 :(得分:0)
斯文的建议至少似乎解决了这个问题。据报道,该问题也发生在IE9中。我不确定这个解决方案是否已修复,因为我还没有测试它。
以下是我解决问题的方法:
var extCont = facesContext.getExternalContext();
var response = extCont.getResponse();
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");