Javascript Ajax—我需要在每次Ajax请求之前检查是否存在有效会话

Javascript Ajax—我需要在每次Ajax请求之前检查是否存在有效会话,javascript,jquery,Javascript,Jquery,我正在做一个使用用户身份验证的项目。如果在发出请求时没有经过身份验证的会话,我的AJAX请求将面临一个问题 我有一个3分钟的会话超时,因此如果用户保持空闲3分钟,然后执行一些导致AJAX请求的操作,那么请求将失败并返回403错误。在这里,我计划截取来自页面的所有AJAX请求,并向服务器发送一个ping,它将返回一个JSON对象,说明是否存在有效会话。如果有,客户端将继续当前请求,否则将重新加载当前页面,用户将进入登录页面,用户必须再次提供凭据 这是我的实现 $("#param-ajax").aj

我正在做一个使用用户身份验证的项目。如果在发出请求时没有经过身份验证的会话,我的AJAX请求将面临一个问题

我有一个3分钟的会话超时,因此如果用户保持空闲3分钟,然后执行一些导致AJAX请求的操作,那么请求将失败并返回403错误。在这里,我计划截取来自页面的所有AJAX请求,并向服务器发送一个ping,它将返回一个JSON对象,说明是否存在有效会话。如果有,客户端将继续当前请求,否则将重新加载当前页面,用户将进入登录页面,用户必须再次提供凭据

这是我的实现

$("#param-ajax").ajaxSend(function(evt, request, settings) {
var pingurl = GtsJQuery.getContextPath() + '/ping.json';
var escapedurl = pingurl.replace(/\//g, "\\/");

var regexpr1 = eval('/^' + escapedurl + '\\?.*$/');
var regexpr2 = eval('/^' + escapedurl + '$/');
// Proceed with the ping only if the url is not the ping url else it will
// cause recursive calls which will never end.
if (!regexpr1.test(settings.url) && !regexpr2.test(settings.url)) {
    var timeout = false;
    $.ajax({
                url : pingurl,
                cache : false,
                data : {
                    url : settings.url
                },
                async : false,
                complete : function(request, status) {
                    if (status == "error") {
                        try {
                            // GtsJQuery.getJsonObject() converts the string
                            // response to a JSON object
                            var result = GtsJQuery
                                    .getJsonObject(request.responseText)
                            if (result.timeout) {
                                timeout = true;
                                return;
                            }
                        } catch (e) {
                            // ignore the error. This should never occure.
                        }
                    }
                }
            });
    // Reload the window if there is a timeout -- means there is no valid
    // sesstion
    if (timeout) {
        window.location.reload();
    }
}
});
这里一切正常,包括window.location.reload(),但原始ajax请求没有中止。由于页面重新加载触发后原始AJAX请求不会中止,因此AJAX请求也会发送到服务器。我想要一些机制,如果超时结果为真,允许我中止原始请求

提供了一些答案,但问题仍然存在于使用AJAX的第三方插件,如datatables。我们无法为这些AJAX请求编写错误处理程序


谢谢你。

如果我了解情况,你不需要这些。在最初的ajax请求中,只需添加一个将重定向用户的错误函数

errHandler = function(XMLHttpRequest, textStatus, errorThrown) {
      if( textStatus.match(/forbidden/i) ) {
        redirectUserToLoginHere();
      }
}

$.ajax({

    success: yourFunctionHere,

    error: errHandler
})
然后,您可能能够制作一些ajax包装器,它始终具有errHandler,这样您就不必在每个ajax调用中都放置它

编辑:

在一些实验之后,如果“ajaxSend”处理程序抛出错误,那么原始请求将永远不会被发送

另外,如果处理程序

document.location = '/login';
那么原始请求将永远不会发送


希望这有帮助:)

我现在改变了我的概念,我正在使用请求头“x-requested-with”在服务器端检查xmlHTTPRequest

如果是xmlHTTPRequest,则“x-request-with”的值为“xmlHTTPRequest”。我使用的两个javascript库(EXTjs和jQuery)都正确设置了这个头

这是我的服务器端代码

boolean isAjaxRequest = StringUtils.endsWithIgnoreCase(request.getHeader("x-requested-with"), "XMLHttpRequest")
编辑

如果给定的请求是ajax请求,那么响应将是json数据,状态为403,它将包含一个名为timeout的键,值为true 例如:{超时:真,…}


然后我们将在$.ajaxError()事件处理程序中处理此错误。如果错误状态为403,超时值为true,则我将重新加载页面。

问题在于我使用的是第三方工具,如datatables,它在内部使用AJAX获取数据。我无法在那里编写错误处理程序,我也不希望每个请求都单独处理这个问题。我认为您仍然没有解决如何处理问题的重新加载部分。使用“x-request-with”头是一种很好的方法,可以知道给定的请求是否是AJAX请求