我在java spring项目中使用jquery jqGrid插件。我正在使用服务器端分页和排序,所以当用户更改页面时,jqgrid会发送一个ajax请求。我的问题是,有时用户的会话可能在ajax请求和我的服务器端代码期间超时,将ajax请求重定向到登录页面。 我需要检测jqgrid ajax请求中的服务器重定向。实际上,我希望在每次jqgrid请求之后触发 afterRequest 事件。我看到loadComplete
和beforeProcessing
事件,但这些事件在有数据的请求之后触发,如果请求在服务器上没有数据或重定向,则这些事件不会触发。我怎么能这样做?
答案 0 :(得分:0)
我认为你必须改变你的要求。重定向在透明级别上 ,它是XMLHttpRequest
规范的一部分(请参阅here和the old answer)。您可能需要设置服务器端所需的标头(例如通过xhrFields: { withCredentials: true }
设置jQuery.ajax
ajaxGridOptions: { xhrFields: { withCredentials: true } }
选项)。如果需要,您可以使用Access-Control-Allow-Origin
回调指定loadBeforeSend
HTTP标头的任何其他特定值。它有jqXHR
个对象作为参数,它是XMLHTTPRequest
对象的扩展。因此,您可以使用jqXHR.setRequestHeader
方法(请参阅the answer)来实际自定义请求。
如果重定向后的最终响应有另一个正文,那么您可以在beforeProcessing
或loadError
回调中检测到它。两个回调都包含jqXHR`对象作为参数。因此,您可以完全访问基础Ajax响应中的所有信息。
很抱歉,我无法向您提供更多详细信息,但您的问题不包含有关此问题的技术详细信息(例如HTTP跟踪)。
答案 1 :(得分:0)
您可以使用此脚本中的globa ajax管理处理任何jqgrid或其他组件的ajax重定向:
$(document)
.ajaxStart(function() { $('#loadingPane').show(); }) /* catch ajax start event*/
.ajaxStop(function() { $('#loadingPane').hide(); }) /* catch ajax stop event */
.ajaxError(function(event, jqxhr, settings, exception) /* catch ajaxerror and specifically redirections */
{
if ( settings.url.indexOf("aspx")>0 && (jqxhr.status === 401 || jqxhr.status === 403) ) {
event.stopPropagation();
location.reload(true);
}
}
);