【问题标题】:Check Session before every Jquery Ajax hit在每次 Jquery Ajax 命中之前检查 Session
【发布时间】:2011-12-30 13:00:08
【问题描述】:

我已经在 MVC 中实现了一个项目,并且我用 ajax 请求完成了大部分工作。但我们正面临会话超时的问题。所以我想要一些关于 ajax 的东西,在执行任何 ajax 请求之前它会检查会话,然后处理该 ajax 请求。

我不想在我使用 ajax 的所有页面中写 if else 条件。

请提出一些建议。

谢谢 阿图尔

【问题讨论】:

  • 你在使用spring security吗?
  • 不..我没有使用弹簧安全
  • 这是一个基于 Java 的网络应用吗?
  • 在这篇文章中加上“Asp.net MVC”标签可能会有所帮助,以获取该技术专家的意见...

标签: jquery asp.net-ajax


【解决方案1】:

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

【讨论】:

  • 在应用程序中发生对 $.ajax() 的任何调用之前,是否会应用 $.ajaxPrefilter()?
【解决方案2】:

我今天一直在处理这个问题,这是我的解决方案:

这个 php 部分(文件或控制器方法)将被 ajax 调用:

// 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 并因此创建无限循环。

【讨论】:

    【解决方案3】:

    我在一个项目中完成的一种方法是实现一个保持活动状态的 ajax 请求,该请求会以一定的时间间隔在后台发送...这样您的会话就不会超时...

    也许不是一种非常优雅的方式,但它确实有效:)

    【讨论】:

    • 但是会话超时的全部意义在于如果一段时间内没有活动,则使会话无效,对吧?
    • 是的,但是在某些情况下您不希望会话超时(在我的项目中,它是一个小型 Intranet 应用程序并且无法重置 php 会话超时),或者如果您有一个编辑页面或博客页面,其中插入文本的时间可能需要一段时间......
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我在使用 jQuery-ajax、spring mvc 和 spring 安全架构时遇到了同样的问题。

      我遵循的解决方案如下。

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

      在登录控制器中检查请求(已保存的请求)是否为 ajax 请求(存在标头 x-requested-with),如果是 ajax 请求,则返回一个指示超时的 json/xml 值。例如:{"session-timeout" : true}.

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 2015-12-27
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多