Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-缓存表单的无效真实性令牌错误_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails-缓存表单的无效真实性令牌错误

Ruby on rails Rails-缓存表单的无效真实性令牌错误,ruby-on-rails,Ruby On Rails,我正在开发一个Rails应用程序(版本4.2.5),它使用rack offline gem缓存一个表单,用户可以在没有internet连接时填写该表单(条目存储为localStorage对象,可以在用户连接后提交)。然而,当表单提交时,我得到了错误 ActionController::EntriesController中的InvalidAuthenticationToken#创建 当我在Rails服务器关闭的情况下打开一个新的浏览器窗口并导航到(页面已被缓存-呈现良好),填写表单,然后重新打开服

我正在开发一个Rails应用程序(版本4.2.5),它使用rack offline gem缓存一个表单,用户可以在没有internet连接时填写该表单(条目存储为localStorage对象,可以在用户连接后提交)。然而,当表单提交时,我得到了错误

ActionController::EntriesController中的InvalidAuthenticationToken#创建

当我在Rails服务器关闭的情况下打开一个新的浏览器窗口并导航到(页面已被缓存-呈现良好),填写表单,然后重新打开服务器并尝试提交时,就会发生这种情况

从我的控制器:

def create
    @entry = Entry.create(entry_params)
    redirect_to "http://localhost:3000/entries"
end
class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
end
以及应用程序控制器:

def create
    @entry = Entry.create(entry_params)
    redirect_to "http://localhost:3000/entries"
end
class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
end


这就解决了问题。然而,我对所有这些意味着什么了解不够,无法理解这是否会造成安全漏洞。是吗?(PS-我真的想避免安全漏洞)

如果您有足够聪明的javascript使用csrf\u meta\u标记,那么csrf\u标记对于ajax表单提交非常有用。否则,您需要将带有令牌的常规表单字段放入表单中:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

如果您以某种方式构建了一个表单,但没有包含真实性令牌,那么这可能会解决您的问题

以下是一些其他想法:

  • 通过检查HTTP交换,确保真实性令牌实际上正在发送到服务器
  • 确保为表单提供服务的服务器与接收表单提交的服务器相同(或者至少确保服务器之间的密钥库匹配)
  • 提交表单时,确保用于检索表单的会话cookie未丢失或过期
  • 说到cookie,请确保您发送的会话cookie与您请求表单时检索到的会话cookie完全相同。我见过这样的情况,当您有多个cookie具有相同的名称并设置了多个不同的域字段时。你可以先把它们全部清除,看看最后会得到什么

  • 谢谢-我尝试过这个,但这给了我错误
    ActionController::InvalidAuthenticityToken
    。我还尝试了其他地方有人推荐的方法——结果相同。我可能忽略了什么?我补充了我所能想到的其他所有问题。谢谢你-我会处理这个问题,看看我能想出什么。啊-我想我理解这个问题。。。表单本身在页面的Javascript中提供(它是动态创建的),然后通过rack::offline缓存。然后我关闭服务器并重新启动它,这意味着我违反了上面的第二点。我会看看我是否能想出一个办法来解决这个问题——这让我觉得我可能需要稍微改变一下我的应用程序的结构。。。