我有一个配置为支持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?
答案 0 :(得分:1)
在jQuery
和jqGrid
源代码中潜水后,我在代码内部看到,在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
}
}
});
。