2010-04-13 85 views
0

我使用JSP开发了一个简单的Web应用程序。它有一个包含用户名,密码字段和sumbit按钮的登录页面。它有一个注销页面,其中包含到登录页面的链接。而且有像第1页,第二页,第三页,第四页,等如何更改导航工具栏中的后退按钮功能?

正常工作流程的某些页面如下:

  • 登录后谈到第1页。
  • 然后点击一些动作,它会转到第2页。
  • 然后点击一些动作,它会转到第3页。
  • 然后点击一些动作,它会转到第4页。所以现在我在第4页。
  • 现在点击浏览器导航工具栏中的返回按钮,一般会转到上一页(第3页)。

但我的要求是,如果您从应用程序中的任何页面点击导航工具栏中的按钮,那么您应该去注销页面。例如:如果你在页面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; 
} 

} 

如果单击后退按钮浏览器,然后返回上一页...

,但我想去注销page..when我在浏览器中单击后退按钮...上面的代码完美地工作吧..

回答

1

理论上,如果您在会话范围内维护一个令牌,该令牌指示当前步骤,并且您通过相应地设置response headers来禁用客户端缓存。如果您使用POST,则还需要实施PRG (post-redirect-get)模式以避免客户端发生“页面过期”错误。

登录后,在进入page1之前,在会话中存储1。在提交page1之后和进入page2之前,在会话中存储2。等等。每次请求页面时,都会检查请求哪个页面,并且页面编号是否等于会话中的编号,如果不是,则重定向到注销页面。

如果您禁用客户端缓存并实施PRG,则客户端将保证激发实际 GET请求,而不是从浏览器缓存请求页面。

+0

这是真的吗?我相信Opera在这方面有一些时髦的行为。请参阅http://dev.opera.com/forums/topic/224464 – MSalters 2010-04-13 12:30:12