【问题标题】:Devise signs out after AJAX request在 AJAX 请求后设计退出
【发布时间】:2012-12-11 16:41:25
【问题描述】:

我正在执行一些 AJAX 请求以添加或删除一些对象。像这样的:

javascript

jQuery.getJSON("/apps/remove_screenshot/' + screenshot_id, function(result) {
    if (result.status == 'ok') {
        screenshot_container.remove() 
    }
});

控制器

class AppsController < ApplicationController
  load_and_authorize_resource
  check_authorization

  # ...

  def remove_screenshot
    # ...
  end
end

config/initializers/devise.rb

config.http_authenticatable = true
# config.http_authenticatable_on_xhr = true
config.navigational_formats = [:html, :json]

问题是,请求已成功执行。但是当我重新加载执行请求的页面时,我得到了访问被拒绝错误。

不过,我在执行remove_screenshot 操作时需要检查身份验证。

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 不。一切都已经完成;另外,会话不会立即过期 - 控制器验证通过。
  • @KateGregory 哦,那条评论的讽刺...... :) 你还确定你的 CSRF 安全令牌包含在你的布局文件的 head 标签中吗?
  • 你可以查看服务器日志,看看你做AJAX请求时是否发送了csrf令牌?

标签: ruby-on-rails ajax ruby-on-rails-3 devise


【解决方案1】:

修复了这堆代码(并用类似的代码重写了所有非 jQuery AJAX 请求):

$(function(){
    $.ajaxSetup({
        beforeSend: function( xhr ) {
            var token = $('meta[name="csrf-token"]').attr('content');
            if (token) xhr.setRequestHeader('X-CSRF-Token', token);
        }
    });
});

我的一些 jQuery 插件在不发送 CSRF 令牌的情况下发送 AJAX 请求。

【讨论】:

    【解决方案2】:

    你很可能搞砸了一些小事。你只需要找出你做了什么,这里有几个地方可以看;

    确保您的application.html.erb 具有以下内容;

    <%= csrf_meta_tag %>
    

    然后;

    <%= javascript_include_tag "application" %>
    

    并确保application.js(在您的/app/assets/javascripts 文件夹中)有;

    //= require jquery
    //= require jquery_ujs
    

    【讨论】:

    • 不。你描述的一切都已经完成了。这与我的问题下的两个 cmets 相同 =)
    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多