【问题标题】:JQuery $.ajax set cookie and get html responseJQuery $.ajax 设置 cookie 并获取 html 响应
【发布时间】:2015-10-06 13:58:42
【问题描述】:

我有一个页面,我想在用户空闲 15 分钟时向他们发出警告。

所以我所做的是,我设置了一个 15 分钟后过期的 cookie,并不断轮询服务器端页面以每 10 分钟刷新一次 cookie 过期时间。

我的问题是,我更新“cookie 过期时间”的 ajax 调用没有返回任何内容。但它应该在设置 cookie 后以 html 的形式返回“OK”(这是在 python,bottle 中完成的。)

如果我在新选项卡中打开此 url,它会延长 cookie 过期时间并给我“OK”,这是正确的。但是当我使用 Jquery ajax 调用它时,它不会返回任何内容。

这是 Ajax 请求的屏幕截图:

如您所见,前两个请求使用的是普通的 ajax 调用,没有返回任何内容。

最后一个是当我使用“编辑并重新发送”选项时 - 它采用 html 类型,但前两次调用的类型是普通的。

如果我在 firefox 开发者工具中尝试“编辑并重新发送”选项,并在不更改任何内容的情况下重新发送请求,它会起作用并返回“OK”。

可能是什么问题?我尝试了在 SO 和 Jquery 文档中找到的一切可能。但似乎没有什么对我有用。这是我的最终代码。

$.ajax({
    timeout: options.AJAXTimeout,
    url: options.keepAliveURL,
    dataType:"html",
    error: function(){
        self.failedRequests--;
    },
    success: function(response){
        if($.trim(response) !== options.serverResponseEquals){
            self.failedRequests--;
        }
    },
    complete: function(){
        if( recurse ){
            self._startTimer();
        }
    }
});

我更新 cookie 的页面:

@app.route('/keepalive/', method = 'GET')
@app.route('/keepalive', method = 'GET')
def keepalive():
    expire_date = datetime.datetime.utcnow()
    expire_date = expire_date + datetime.timedelta(minutes=15)
    ses_key=request.get_cookie('session_key')
    response.set_cookie("session_key", ses_key, expires=expire_date, path="/")
    response.content_type = 'text/html; charset=UTF-8'
    return template('<div>{{msg}}</div>', msg = "OK")

假设我调用的 URL 是 mysite.com/keepalive/,并且在同一个域名内。

有人可以帮我解决这个问题吗?我在哪里做错了?谢谢!!

【问题讨论】:

    标签: jquery python ajax cookies bottle


    【解决方案1】:

    Firefox 开发者工具提供的有关错误的信息要少得多。如果我用 chrome 打开它,我可以看到它说“已取消”。我搜索了一下并意识到它的发生是因为我的脚本没有等到 ajax 调用完成。

    所以在我将 async:false 添加到我的 ajax 请求后它已修复。

    那是;

    $.ajax({
        timeout: options.AJAXTimeout,
        url: options.keepAliveURL,
        dataType:"html",
        async:false, // ---> added this option.
        error: function(){
            self.failedRequests--;
        },
        success: function(response){
            if($.trim(response) !== options.serverResponseEquals){
                self.failedRequests--;
            }
        },
        complete: function(){
            if( recurse ){
                self._startTimer();
            }
        }
    });
    

    希望这会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2011-03-21
      • 2016-11-19
      • 1970-01-01
      • 2012-10-02
      相关资源
      最近更新 更多