我使用JSP开发了一个简单的Web应用程序。它有一个登录页面,其中包含用户名,密码字段和sumbit按钮。它有一个注销页面,其中包含指向登录页面的链接。还有一些页面,如page1,page2,page3,page4等。
正常工作流程如下:
但我的要求是,如果您从应用程序中的任何页面单击导航工具栏中的后退按钮,那么您应该转到注销页面。例如:如果您在第4页并按后退按钮,那么您应该转到退出页面而不是第3页。
如何实现这一目标?无论如何可能吗?也许用Javascript?
如何在导航工具栏中跟踪和控制浏览器后退按钮功能?
但我最初的要求是:
我使用JSF框架开发了安全的应用程序。
我还使用范围(会话范围)
在我的应用程序中,我使用以下代码......但不能正常工作......
public class **LogoutPhaseListener** implements **PhaseListener**
{
public void **afterPhase**(PhaseEvent event)
{
}
public void **beforePhase**(PhaseEvent event)
{
FacesContext facesContext = event.getFacesContext();
HttpServletResponse httpServletResponse = (HttpServletResponse) facesContext.getExternalContext().getResponse();
httpServletResponse.addHeader("Pragma", "no-cache");
httpServletResponse.addHeader("Cache-Control", "no-cache");
httpServletResponse.addHeader("Cache-Control", "must-revalidate");
httpServletResponse.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");
httpServletResponse.addHeader("Cache-Control", "no-store");
}
public PhaseId **getPhaseId**()
{
return PhaseId.RENDER_RESPONSE;
}
}
如果我在浏览器中单击后退按钮,则会转到上一页...
但是我想要退出页面..当我点击浏览器中的后退按钮...上面的代码不完美地工作..
答案 0 :(得分:1)
理论上,如果您在会话范围中维护一个表示当前步骤的令牌,并且通过相应地设置response headers来禁用客户端缓存,则理论上是可行的。如果您正在使用POST,则还需要实现PRG (post-redirect-get)模式,以避免客户端出现“页面过期”错误。
登录后,在转到第1页之前,将1
存储在会话中。提交page1之后,在转到第2页之前,将2
存储在会话中。等等。每次请求页面时,您都会检查请求的页面以及页码是否等于会话中的号码,如果没有,则重定向到注销页面。
如果您禁用客户端缓存并实施PRG,那么客户端将保证触发真正的 GET请求,而不是从浏览器缓存中请求该页面。