会话超时后自动重定向到登录页面 - JSP,Spring

Posted

技术标签:

【中文标题】会话超时后自动重定向到登录页面 - JSP,Spring【英文标题】:automatically redirect to login page after session timeout - JSP, Spring 【发布时间】:2013-10-20 11:48:15 【问题描述】:

我可以在会话注销时将用户重定向到主页。这非常简单。但是,如果用户登录了应用程序并打开了页面,即使会话超时,他也能够执行所有功能(这很糟糕)。

在页面刷新或提交到服务器之前不会发生重定向...有一些更新功能可以由用户完成,即使他当前没有登录...我已经做了很多的研究,但无法修复此解决方案。我也找到了这个帖子,但似乎没有正确的答案:

Spring Security 3.1 - Automatically redirect to login page when session-timeout occurs

例如,大多数银行网站会在超时后将您注销。他们不会等到您回来后再提交请求,然后才会将您重定向到主页。

【问题讨论】:

我没有得到你提到until page refresh的部分,你在页面上只使用ajax 如果有人尝试访问经过身份验证的 url,请检查用户是否存在于会话中,如果不存在则重定向到登录页面。此检查必须在登录后可访问的所有页面/功能中进行。 【参考方案1】:

HTTP 是无状态的。为了实现某种形式的状态,服务器可以通过在每个用户的第一次请求时给他们一个会话 id 来为每个用户维护一个会话。用户必须在以后的每个请求中重新发送该会话 ID,以识别其他请求发生在同一会话中。

由于会话由服务器维护,因此无法通知客户端会话已超时。

相反,如果用户在会话超时时发出新请求,则他们的会话 ID 不再有效,因此您可以采取特定操作,例如将他们重定向到登录页面。

【讨论】:

请参考我下面的评论。仅供参考,我知道 HTTP 是无状态的。看来我还没有说清楚…… @user 是的,我的第二段解决了这个问题。服务器(没有推送)无法通知客户端。您可以实现某种 AJAX 请求,它不会重置计数器,但会检查会话是否超时。【参考方案2】:

假设没有任何结果。您可能需要考虑以下提到的方法:

方法一: 在浏览器上创建一个 cookie 并在其中包含 encrypted timestamp,其中将包含来自浏览器的上次访问/请求时间戳,对于每个请求,首先获取此 cookie 值并与预定义的会话结束时间进行比较,如果达到会话结束时间则将用户重定向到错误页面,否则为请求提供服务。注销时删除 cookie。

为什么要为时间戳加密值:如果用户以某种方式知道用于会话超时的 cookie,那么他可以在浏览器中更改此值并继续发送此请求。

方法二: 您还可以通过在数据库中为每个登录用户创建一个条目并为每个请求更新此数据库中的时间戳来实现此目的。对于每个传入请求,从数据库中获取此时间戳,并将其与超时的预定义值进行比较并相应地进行处理。注销时删除该条目。

In both the approaches explicitly perform response.redirect("errorPageUrl");

【讨论】:

Rupesh,我已经按照你的建议做了。让我用一个场景来解释一下:事件1)用户登录到应用程序。事件 2) 应用程序上没有活动,因此会话超时(但页面仍然在浏览器上打开)。事件 3) 用户返回并尝试向服务器发送请求。事件 4) 我的代码将用户重定向到主页。现在,我想要的是,在会话超时时,页面应该自动重定向到主页,而不是让用户提交请求然后被重定向到主页。有意义吗?

以上是关于会话超时后自动重定向到登录页面 - JSP,Spring的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 3.1 - 发生会话超时时自动重定向到登录页面

会话超时后如何将用户重定向到自定义网页?

JSF 2 + Spring 3 + Shiro - 会话超时不重定向到登录页面

如果会话超时,如何在 MVC 中的 jquery ajax 调用后重定向到新页面?

当会话超时重定向到 GWT 项目中的登录页面时

会话超时通知