跨域AJAX POST withCredentials和IE8 +兼容性

时间:2014-10-19 15:05:59

标签: ajax json internet-explorer post cross-domain

我的一个站点的登录设置,用户将其信息输入到主页上的登录弹出窗口,然后将信息提交回servlet,然后通过JSON接收回复。然后主页继续将用户发送到他们的个人资料页面,或者显示错误(例如,如果用户名和密码不匹配)。

$.ajax({
    dataType: 'jsonp',
    async: false,
    url: loginLocation,
    type: 'GET',
    crossDomain: true,
    cache: false,
    xhrFields: crossDomain ? {
        withCredentials: true
    } : {},
    data: ({'key1': value1, 'key2': value2, ..., 'keyN':'valueN'}),
    success: function(data){
        if (data && data.status && data.status == "success") {
            window.location = profileLocation;
        } else {
            errorHandler();
        }
    },
    error: errorHandler
});

我希望将此更改从GET请求更改为POST,以防止将任意查询字符串发送到servlet。但是,似乎在这里有几个关于应该如何制定解决方案的考虑因素。它必须:

  • 使用POST代替GET
  • 是一个跨域请求(登录页面和servlet位于我可以访问/控制的两个域上)
  • 使用withCredentials参数(登录功能依赖于JSESSIONID cookie,因此需要此参数)
  • 与IE8及以上版本兼容

我试过调查符合上述标准的跨域ajax请求,但主要的关键点似乎是IE8 / IE9的兼容性。像easyXDM这样的方法在支持这些浏览器方面似乎含糊不清(我在网上看到过关于IE8如何工作的相互矛盾的报告)我不想冒险意识到它在实现中途不会起作用

简而言之,是否有办法使用POST和withCredentials参数进行跨域ajax请求,这也与IE8 +兼容? easyXDM是一个合适的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我能够通过使用xdomain库(在https://github.com/jpillora/xdomain找到)来确定上述问题的解决方案,该库覆盖了请求行为以允许IE8和IE9中的跨域ajax。这包括设置proxy.html,如xdomain站点上的示例所示,以及将Access-Control-Allow-Origin和其他相关标头添加到服务器响应。这允许按照原始帖子中列出的条件在IE8 +中使用withCredentials进行跨域ajax JSON POST请求。它还允许HTTP和HTTPS之间的跨域请求。