Jimbo做得很出色,解释了您遇到的问题背后的“原因”。您可以采用两种方法来解决此问题:
- (如Jimbo的建议)重写Devise :: SessionsController以返回新的csrf令牌:
class SessionsController < Devise::SessionsController def destroy # Assumes only JSON requests signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)) render :json => { 'csrfParam' => request_forgery_protection_token, 'csrfToken' => form_authenticity_token } end end并在客户端为您的sign_out请求创建成功处理程序(可能需要根据您的设置进行一些调整,例如GET vs DELETE):
signOut: function() { var params = { dataType: "json", type: "GET", url: this.urlRoot + "/sign_out.json" }; var self = this; return $.ajax(params).done(function(data) { self.set("csrf-token", data.csrfToken); self.unset("user"); }); }这还假定您将在所有AJAX请求中自动包含CSRF令牌,如下所示:
$(document).ajaxSend(function (e, xhr, options) { xhr.setRequestHeader("X-CSRF-Token", MyApp.session.get("csrf-token")); });- 更简单地说,如果适合您的应用程序,则可以简单地覆盖
Devise::SessionsController
和,并使用覆盖令牌检查skip_before_filter :verify_authenticity_token
。



