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