如何使用jqGrid发送凭据

How to send credentials with jqGrid?

本文关键字:何使用 jqGrid      更新时间:2024-04-28

我有一个配置为支持CORS的服务。通常,当我执行服务器请求时,我会通过jQuery准备一个请求对象,并将withCredentials参数集添加到true,它可以正常工作。

但是我有一个带有服务器分页的jqGrid,我不能完全管理xhr对象。我已经添加了loadBeforeSend事件,在该事件中我添加了一些头,并被正确地发送到服务器。

我还看到了这篇文章(与jQueryajax请求有关):可能的答案。我尝试通过以下方式将withCredentials属性添加到xhr对象中:

$('#grid').jqGrid({
    loadBeforeSend: function (jqXHR, settings) {
        jqXHR.setRequestHeader('Accept-Language', 'en-US'); 
        jqXHR.setRequestHeader('SiteApplication', '1');
        jqXHR.withCredentials = true;
    }
});

甚至通过这种方式:

$('#grid').jqGrid({
    loadBeforeSend: function (jqXHR, settings) {
        jqXHR.setRequestHeader('Accept-Language', 'en-US'); 
        jqXHR.setRequestHeader('SiteApplication', '1');
        jqXHR.xhrFields = {
            withCredentials: true
        }
    }
});

类似于帖子中解释的解决方案。但它没有起作用。

知道如何将cookie发送到服务器吗?

在深入研究了jQueryjqGrid源代码之后,我已经在代码内部,在jQuery.ajaxTransport函数中,jQuery创建了一个本地XMLHttpRequest javascript对象。这个对象是由一个名为"s"的本地对象在上述函数中创建的。

在此之后,该对象具有一个名为"xhrFields"的属性,该属性将动态地向标准xhr对象添加新字段。在调试了该级别的代码后,我意识到jqGridloadBeforeSend事件中接收到的"settings"参数与创建请求对象的对象"s"相同。

总之,我已经修改了我的代码,将"xhrFields"属性添加到"settings"参数中,并且它正在工作。我的解决方案如下:

$('#grid').jqGrid({
    loadBeforeSend: function (jqXHR, settings) {
        jqXHR.setRequestHeader('Accept-Language', 'en-US'); 
        jqXHR.setRequestHeader('SiteApplication', '1');
        settings.xhrFields = {
            withCredentials: true
        }
    }
});

通过这种方式,服务器请求将用户凭据(cookie)正确发送到服务器,我很高兴避免使用其他解决方案,如在其他帖子中看到的那样,在cookie中添加自定义标头。

更新:@Oleg为我的问题发布了更好的解决方案。尽管我的答案有效,并且可以帮助任何有类似问题的人,但对于这种特定情况,修改ajaxGridOptions并将"xhrFields"属性添加到此属性更为优雅(我认为)。

所以代码应该是这样的(非常概括,我在创建时省略了网格的其余属性):

$('#grid').jqGrid({
    loadBeforeSend: function (jqXHR, settings) {
        jqXHR.setRequestHeader('Accept-Language', 'en-US'); 
        jqXHR.setRequestHeader('SiteApplication', '1');
    },
    ajaxGridOptions: {
        xhrFields: {
            withCredentials: true
        }
    }
});

我已经意识到不需要crossDomain: true