我有一个网页,登录后,您基本上坐在一个页面上,做几件导致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;
是否有某种方法可以绕过在请求映射中重置会话的到期时间?
答案 0 :(得分:1)
您可以发出不发送任何cookie或jsession id的ajax请求,因此服务器认为它是一个新会话,并且不会扩展真实会话。 您还需要以另一种方式将jsession id传递给服务器,以便服务器可以查找会话以查看是否需要过期。
以下是阻止Cookie的一些想法: Prevent Cookies From Being Sent on AJAX Request