2

我有带有 4 个 AJAX 请求的页面,这些请求会触发以将订单请求发送到第 3 方系统。首先,发送产品信息,然后将客户详细信息附加到订单上,然后是适用于订单的任何注释,最后是第四次“完成”订单的请求。

在 IE9、Firefox (mac + pc)、Safari (mac + pc) 和 Chrome (mac + pc) 中一切正常,但是,当从 IE<9 发送请求时,正确触发 AJAX 请求并返回正确响应没有错误,但似乎它为每个呼叫通过不同的会话发送,因此第 3 方系统将 4 个不同的请求识别为来自不同的会话。

如果我通过 IE8 中的地址栏一一发送请求,一切都按预期工作并且顺序捆绑在一起,只有通过 jQuery .ajax 发送时才会忘记会话。

我能做些什么来强制这些浏览器保持会话吗?

这是我的代码:

//function to add the product to the cart and cascade down to finalise the order
function addToCart(){
    var jsonurl = "xxxxx/additem?variationID="+$('input[name="variationID"]').val()+"&token="+APIKey+"&callback=?";
    $.ajax({
        url:jsonurl,
        type:'GET',
        dataType:'json',
        success:function(data){
            if (data.response == "success"){
                addLeadCustomer();
            } else {
                displayEnquiryError();
            }


        },
        error:function(data){
            displayEnquiryError();
        }
    })  
}


//function to add the lead customer and cascade down to finalise the order
function addLeadCustomer(){
    //add the lead customer to the order in J6
    jsonurl = "http://xxxxx/leadcustomer?token="+APIKey+"&details[FirstName]="+$('input[name="Name"]').val()+"&details[Email]="+$('input[name="Email"]').val()+"&details[HomePhone]="+$('input[name="Phone"]').val()+"&callback=?";
    $.ajax({
        url:jsonurl,
        type:'GET',
        dataType:'json',
        success:function(data){
            if (data.response.ID > 0){
                updateOrderAdditionalInfo();
            }else{
                displayEnquiryError();
            }
        },
        error:function(data){
            displayEnquiryError();
        }
    })
}

//function to update the order with the additional info and cascade down to finalise the order
function updateOrderAdditionalInfo(){
    //update the order with additional information
    jsonurl = "http://xxxxx/updateorder?token="+APIKey+"&details[Notes]="+$('input[name="EnquiryDate"]').val()+"\n\n"+$('select[name="NumberNights"]').val()+" nights\n\n"+$('select[name="NumberPeople"]').val()+" people\n\n"+$('textarea[name="Comments"]').val()+"&callback=?";
    $.ajax({
        url:jsonurl,
        type:'GET',
        dataType:'json',
        success:function(data){
            if (data.response == "success"){
                completeOrder();

            }else{
                displayEnquiryError();
            }
        },
        error:function(data){
            displayEnquiryError();
        }
    });
}

//function to complete the order
function completeOrder(){
    //complete the "order"
    jsonurl = "http://xxxxx/completeorder?token="+APIKey+"&callback=?";
    $.ajax({
        url:jsonurl,
        type:'GET',
        dataType:'json',
        success:function(data){
            if (data.response == "success"){
                $('.waiting').fadeOut(function(){
                    $('.enquirySuccess').fadeIn();
                    $('.cartItemsHolder').empty();
                    $('.cartItemsHolder').html('We have received your itinerary');
                })
            }
        },
        error:function(data){
            displayEnquiryError();  
        }
    });
}

$('#Form_enquiryForm').submit(function(){
    validateForm();
    if (failedValidation == 0){
        $(this).fadeOut(function(){
            $('.waiting').fadeIn();
            //add the package to the cart
            addToCart();
        });
    }
    return false;
});

更新:我遇到了一些帖子,这些帖子给人的印象可能是因为 IE8 的缓存。这导致我在我的 AJAX 调用中尝试 cache:false 并向查询字符串 (&cachebuster="+Math.random()) 添加一个随机数参数,但都没有解决问题。

4

1 回答 1

1

我发现这是因为 IE8 对 3rd 方 cookie 的默认处理。它阻止了他们。通过在 IE8 中调低我的安全设置,我能够获得所需的行为。看起来我们将不得不重新编写 API 以传回一个标识符,我们每次都可以触发该标识符以将请求绑定在一起。

更新:Safari 默认也拒绝 3rd 方 cookie。在测试设置 cookie 之前,我已经从 Safari 的地址栏中触发了 API。在我重置 Safari 并重新测试后,它表现出与 IE8 相同的行为。

Update2:我们实际上以不同的方式解决了这个问题。我们设置了一个 API 来设置会话并关闭窗口。然后,使用 jQuery,我们检测浏览器。如果是 IE<=8 或 Safari,我们会弹出一个新 API 的弹出窗口(这会设置会话并立即关闭窗口)。我们现在可以在我们的应用程序中使用我们的会话。我们还使用 jQuery 设置了一个 cookie,其到期时间与购物车中的会话相同,以让我们知道我们已经设置了会话。

它无论如何都不完美。例如,如果 jQuery cookie 丢失了,那么我们必须在购物车上作为一个新会话开始。如果购物车会话丢失,那么我们将在购物车不记得我们的情况下继续在不知不觉中开火,这使我们回到最初的问题......并且不要让我开始使用弹出窗口阻止程序:)快速修复,直到我们实施更强大的东西。

于 2012-09-10T02:53:36.147 回答