5

我有一个网页,在登录后,您基本上会坐在一个页面上并做几件导致 AJAX 请求的事情。

由于 AJAX 请求与普通 HTTP 请求没有什么不同,因此它们在到达服务器时会根据需要延长会话的到期时间。

我对此没有任何问题,因为只有在用户与服务器交互时才应该扩展用户的会话,这是有道理的。

由于用户基本上停留在这一页上,我希望能够在他们的会话过期时通知他们,而不是让他们在超时发生后尝试通过任何操作访问服务器时找出困难的方法。

因此,我被要求实现类似于我在银行网站上经常看到的东西,alert在用户会话到期之前会出现一个弹出窗口 ( )。我不需要它在之前出现,但是“一旦”它过期(或者在它发生后尽可能接近),所以用户不能在页面上做任何事情并且不小心被重定向到登录页面。

我最初的想法是轮询服务器并每 30 秒左右检查一次。问题在于 AJAX 请求会重置会话的到期时间(即 30 分钟),从而使使用此轮询的点无效。

当然,一个“解决方案”是在 Javascript 中处理这个问题——当接收到正常操作的 AJAX 请求时,重置一个计时器。此计时器将在设置后 30 分钟运行。而且我知道这不会太难,因为我可以将它附加到 jQuery 的全局 AJAX 处理程序,以便它在每次成功的 AJAX 调用后重置计时器,但我似乎不适合跟踪会话时间出在两个地方。我宁愿“浪费”资源并经常进行 AJAX 调用。我只是不希望用户不得不做一些事情来找出他们的会话何时到期 - 如果他们离开他们的计算机 31 分钟,我希望在他们回来时有一条消息说他们的会话已经过期并且他们会被重定向。

从我浏览的许多文章/解释中,我真的找不到任何适用于我的情况的东西。我见过使用 Spring Security 的东西,但不幸的是我们没有使用它,因为我们不使用普通的用户名/密码方案,并且无法弄清楚如何自定义它来工作。

我已经看到了“过滤器”或“拦截”这些术语,但我不确定我是否可以使用它们,因为它似乎是一个安全问题。

所以基本上,我正在寻找一种能够在会话过期时进行 HTTP 请求检查的方法,而无需重置其过期时间。我基本上只需要基于此(我可以弄清楚)以某种形式的真/假来回应。

我真的很想在服务器上保留这种处理,并允许在会话超时时进行轮询,因此 HTTP 请求需要能够查看会话的当前状态并进行分析,但不能重置超时。

如果有帮助,我的会话声明如下:

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserDataSession {

我的控制器像这样使用它:

@Autowired
private UserDataSession userDataSession;

有没有办法绕过请求映射中会话到期的重置?

4

1 回答 1

1

您可以发出不发送任何 cookie 或 jsession id 的 ajax 请求,因此服务器认为它是一个新会话,并且不会扩展实际会话。您还需要以另一种方式将 jsession id 传递给服务器,以便服务器可以查找会话以查看它是否需要过期。

以下是阻止 cookie 的一些想法: 防止 cookie 在 AJAX 请求上发送

于 2013-01-16T05:22:14.067 回答