如何使用jqGrid发送凭据?

时间:2015-02-24 12:23:31

标签: javascript jquery ajax cookies jqgrid

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

但我有jqGrid服务器分页,我无法完全管理xhr对象。我已添加loadBeforeSend事件,我已添加了一些标题并正在正确发送到服务器。

我也看过这篇文章(与jQuery ajax请求相关):possible answer。我已尝试通过以下方式将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?

1 个答案:

答案 0 :(得分:1)

jQueryjqGrid源代码中潜水后,我在代码内部看到,在jQuery.ajaxTransport函数中,jQuery创建了一个原生{{1} javascript对象。该对象由上述函数内部的本地对象(称为“s”)创建。

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

总结一下,我修改了我的代码,将'xhrFields'属性添加到'settings'参数,它正在运行。我的解决方案如下:

jqGrid

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

更新: @Oleg 为我的问题发布了更好的解决方案。虽然我的回答有效并且可以帮助任何有类似问题的人,但是对于这个特定情况更优雅(我认为)修改$('#grid').jqGrid({ loadBeforeSend: function (jqXHR, settings) { jqXHR.setRequestHeader('Accept-Language', 'en-US'); jqXHR.setRequestHeader('SiteApplication', '1'); settings.xhrFields = { withCredentials: true } } }); 将“xhrFields”属性添加到此属性。

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

ajaxGridOptions

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