如何使用 jqGrid 发送凭据?
How to send credentials with jqGrid?
我有一个配置为支持 CORS 的服务。通常当我做一个服务器请求时,我准备一个请求 object 通过 jQuery
并且添加 withCredentials
参数设置为 true
,它工作正常。
但是我有一个 jqGrid
带有服务器分页功能,我无法完全管理 xhr
object。我添加了 loadBeforeSend
事件,我在其中添加了一些 headers 并正确发送到服务器。
而且我也看到了这个 post(与 jQuery
ajax 请求相关):possible answer。我尝试通过以下方式将 withCredentials
属性 添加到 xhr
object:
$('#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
}
}
});
类似于 post 中解释的解决方案。但它没有用。
知道如何将 cookie 发送到服务器吗?
在深入研究 jQuery
和 jqGrid
源代码后,我在代码内部看到了 jQuery.ajaxTransport
函数,jQuery
创建了一个原生 XMLHttpRequest
javascript object。这个 object 它是由一个名为 's' 的本地 object 在上述函数中创建的。
在此之后,'s' object 有一个名为 'xhrFields' 的 属性,它将动态地添加新字段到标准 xhr
object .在此级别调试代码后,我意识到 jqGrid
的 loadBeforeSend
事件中收到的 'settings' 参数与创建 object 's' 相同请求 object。
总而言之,我修改了我的代码以将 'xhrFields' 属性 添加到 'settings' 参数并且它正在运行。我的解决方案如下所示:
$('#grid').jqGrid({
loadBeforeSend: function (jqXHR, settings) {
jqXHR.setRequestHeader('Accept-Language', 'en-US');
jqXHR.setRequestHeader('SiteApplication', '1');
settings.xhrFields = {
withCredentials: true
}
}
});
通过这种方式,服务器请求将用户凭据(cookie)正确发送到服务器,我很高兴避免使用其他解决方案,例如添加带有 cookie 的自定义 header,正如我在其他帖子。
更新: @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
。
我有一个配置为支持 CORS 的服务。通常当我做一个服务器请求时,我准备一个请求 object 通过 jQuery
并且添加 withCredentials
参数设置为 true
,它工作正常。
但是我有一个 jqGrid
带有服务器分页功能,我无法完全管理 xhr
object。我添加了 loadBeforeSend
事件,我在其中添加了一些 headers 并正确发送到服务器。
而且我也看到了这个 post(与 jQuery
ajax 请求相关):possible answer。我尝试通过以下方式将 withCredentials
属性 添加到 xhr
object:
$('#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
}
}
});
类似于 post 中解释的解决方案。但它没有用。
知道如何将 cookie 发送到服务器吗?
在深入研究 jQuery
和 jqGrid
源代码后,我在代码内部看到了 jQuery.ajaxTransport
函数,jQuery
创建了一个原生 XMLHttpRequest
javascript object。这个 object 它是由一个名为 's' 的本地 object 在上述函数中创建的。
在此之后,'s' object 有一个名为 'xhrFields' 的 属性,它将动态地添加新字段到标准 xhr
object .在此级别调试代码后,我意识到 jqGrid
的 loadBeforeSend
事件中收到的 'settings' 参数与创建 object 's' 相同请求 object。
总而言之,我修改了我的代码以将 'xhrFields' 属性 添加到 'settings' 参数并且它正在运行。我的解决方案如下所示:
$('#grid').jqGrid({
loadBeforeSend: function (jqXHR, settings) {
jqXHR.setRequestHeader('Accept-Language', 'en-US');
jqXHR.setRequestHeader('SiteApplication', '1');
settings.xhrFields = {
withCredentials: true
}
}
});
通过这种方式,服务器请求将用户凭据(cookie)正确发送到服务器,我很高兴避免使用其他解决方案,例如添加带有 cookie 的自定义 header,正如我在其他帖子。
更新: @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
。