我有一个线性Java EE Web应用程序,要求用户以线性方式跨多个页面输入数据。我在应用上设置了超时。 (我在超时之前还有一个javascript警报,用于警告用户,如果他们不想继续则重定向)。
这很好,除了我的问题是如果用户在sessioon过期后单击他们的后退按钮,他们可以看到数据。我在某种程度上使用这个SO答案解决了这个问题:
Prevent user from seeing previously visited secured page after logout
但是,这不是自定义页面,并且如果会话尚未过期也会发生。
如果会话已经过期(最好没有JS),如何在用户点击后向用户显示自定义页面?
答案 0 :(得分:3)
这是一个选项,要求您的Web应用程序使用在许多Web框架(如Spring Web Flow)中实现的POST-REDIRECT-GET pattern。
在这样的上下文中,会话到期后后退意味着浏览器发送新的GET
请求,您的服务器代码会收到一个全新的HttpSession
。由于向导在第一页启动的会话属性,您可以检测到这种情况:如果GET
请求不是第一页,并且会话不包含该属性,则意味着通过注销或到期超时,会话已丢失。因此,您可以显示一个自定义页面,提醒用户他失去了工作,并将他引导到向导的第一页。
使用POST-REDIRECT-GET模式,浏览器的后退按钮无法显示最新输入的上一个表单而不发送我提及的新GET请求。
顺便说一下,如果你设计了很多这样的向导,我建议你使用只包含在控制器servlet中的Spring Web Flow,这样你就可以使用任何视图技术了。
替代方案:由于自定义持久性Cookie可以避免数据丢失,这些Cookie存储(清除或编码)用户在每次提交到服务器后在向导期间提供的所有信息。在这种情况下,即使会话属性也没用。但实现起来可能很复杂,因为有很多限制,例如最大cookie长度,cookie数量或最大HTTP标题行,因为所有cookie都是在一行上发送的......