2011-12-30 64 views
2

我已经在MVC中实现了一个项目,并且我已经用ajax请求完成了大部分工作。但我们正面临会话超时的问题。所以我想要一些与Ajax有关的事情,在做任何Ajax请求之前检查会话,然后处理该Ajax请求。在每个jquery Ajax命中之前检查会话

我不想写如果其他条件在我使用ajax的所有页面中。

请建议一些方法。

感谢 阿图尔我在一个项目做了

+0

您使用弹簧安全吗? – 2011-12-30 13:03:14

+0

不是..我没有使用弹簧安全 – 2011-12-30 13:08:56

+1

这是一个基于Java的网络应用程序吗? – 2011-12-30 13:12:14

回答

1

也许你应该检查jQuery.ajaxPrefilter()(http://api.jquery.com/jQuery.ajaxPrefilter/)。你也不能修改你的应用程序池关于空闲超时的设置来完全避免会话超时?

+0

$ .ajaxPrefilter也适用于$ .get。 – 2011-12-30 13:21:51

+0

在应用程序中发生$ .ajax()调用之前是否应用$ .ajaxPrefilter() ? – 2011-12-30 13:28:57

0

一个办法是实现它获取的背景在一定的时间间隔发送保活Ajax请求......让你的会话没有得到超时......

也许不是一个很优雅的方式,但它的工作:)

+0

但是,所有会话超时点都会使如果在一段时间内没有活动会话,对吗? – 2011-12-30 13:07:13

+0

是的,但有些情况下您不希望会话超时(在我的项目中,它是一个小型Intranet应用程序,php会话超时无法重置),或者如果您有编辑页面或博客页面插入文本的时间可能需要一段时间... – Vapire 2011-12-30 13:09:31

0

我有jQuery-ajax,spring mvc和spring安全体系结构的问题。

我遵循的解决方案如下。

如果发生会话超时,spring security会将请求重定向到登录表单控制器。

在登录控制器中检查请求(Saved Request)是否是ajax请求(表头为x-requested-with),如果它是ajax请求,则返回表示超时的json/xml值。例如:{"session-timeout" : true}

然后使用全局jQuery ajax事件(如ajaxSuccess/ajaxError)来测试此ajax返回的值,以查看是否存在会话超时并采取您想采取的任何操作。

您可以使用您正在使用的任何应用程序框架来尝试这样的事情。

0

您可以创建一个global filter;全局过滤器会影响每个控制器操作,可以检查会话是否存在,然后重定向到登录页面或按照某种方式执行操作。此外,您可以通过创建一个视图来保持会话的活跃,而该视图使用AJAX或使请求保持到服务器的iframe进行ping,因此会话保持活动状态。现在的问题是你要会活下去那么久那么......

1

我今天一直围绕这个问题,这是我的解决方案:

这个PHP部分(文件或控制器的方法)将被称为阿贾克斯:

// create your preferred way of returning a json object like { "isLogged": true } 
echo json_encode(array('isLogged' => checkSession())); 

现在,把这个脚本中的所有页面都具有AJAX调用和需要用户的开始要记录:

$(document).ajaxSend(function(e, xhr) { 
    $.ajax({ 
     url: 'checkSession.php', 
     type: 'GET', 
     global: false, 
     success: function(session) { 
      if(!session.isLogged) { 
       xhr.abort(); 

       // This allows my framework to take care of the redirect 
       // and to remember the intended page, 
       // so it redirects back here after login: 
       location.reload(); 

       // use this one to redirect directly to the login page: 
       // window.location.replace('login.php'); 
      } 
     }, 
     dataType: 'json' 
    }); 
}); 

global: false部分在这里是必不可少的,为了防止这个ajax调用输入ajaxSend并因此创建一个无限循环。