我是 Java EE 和 JSF 的新手。我正在尝试创建登录系统,但是当用户注销时,后退按钮出现问题。为了解决这个问题,我按照我在 stackoverflow 上找到的其他几个主题中的建议创建了一个过滤器,它看起来像这样:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse hsr = (HttpServletResponse) res;
hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
hsr.setHeader("Pragma", "no-cache");
hsr.setDateHeader("Expires", 0);
chain.doFilter(req, res);
}
现在页面没有被缓存。在每个页面上都调用了如下所示的身份验证函数:
public void authenticate(ComponentSystemEvent event) {
if(!userName.equals("Admin")) {
FacesContext context = FacesContext.getCurrentInstance();
ConfigurableNavigationHandler navHandler = (ConfigurableNavigationHandler)
context.getApplication().getNavigationHandler();
navHandler.performNavigation("/root/start");
}
}
因此,当管理员未登录时,应用程序会将我重定向到登录页面(现在它仅适用于一个名为 admin 的用户就足够了)。
问题是当管理员注销并使用后退按钮时,会出现一个特定于浏览器的网页,其中包含有关过期网页的信息,目前有两种情况:
1)用户已登录,当他点击刷新时页面正常显示。
2)用户已注销,当他再次点击刷新或使用后退按钮时,将抛出javax.faces.application.ViewExpiredException然后用户将被重定向到登录页面(/root/start - 我在我的 web.xml 中配置了它)。
我想要做的就是跳过有关过期网页的浏览器信息 - 已注销的用户必须在使用后退按钮后立即重定向到登录页面,并且登录用户可以正常使用后退按钮而不会收到有关过期页面的警告。初学者可以实施的任何解决方案(如果有的话)?