首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby on Rails表单页面缓存,包括authenticity_token

Ruby on Rails表单页面缓存,包括authenticity_token
EN

Stack Overflow用户
提问于 2010-03-05 12:30:19
回答 5查看 5.3K关注 0票数 18

我有一个简单的Ruby on Rails表单,其中包含一个authenticity_token。不幸的是,我错过了当你页面缓存这个页面时,真实性令牌变得无效。我很高兴我弄明白了这一点。

在这种情况下,如何解决缓存问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-16 01:35:37

正如Matchu发布的,你可以从this post实现第二点(与他发布的链接相同,但也可以通过我的谷歌找到)。这增加了对JavaScript的依赖,这可能是您想要的,也可能不是。

或者,您可以查看Fragment Caching。这允许您缓存页面的某些部分,但仍会生成动态部分(例如具有真实性令牌的表单)。使用这种技术,您可以缓存页面的其余部分,但会为每个请求生成一个新表单。

最后一种解决方案(但最不利的)是禁用该特定操作的真实性令牌。您可以通过将以下内容添加到生成该表单的控制器的开头来完成此操作:

代码语言:javascript
复制
protect_from_forgery :except => [:your_action]

也可以通过在开头添加以下内容来禁用整个控制器的protect_from_forgery:

代码语言:javascript
复制
skip_before_filter :verify_authenticity_token
票数 24
EN

Stack Overflow用户

发布于 2010-03-05 12:37:57

这似乎不是一个很好解决的问题。Point two on this blog post描述了如何使用jQuery来完成任务,但这引入了Javascript依赖。权衡一下你的选择,我想。

票数 1
EN

Stack Overflow用户

发布于 2012-07-25 22:20:25

您可以在缓存的标记中呈现一个自定义标记,并将其替换为在每次请求时呈现的表单。

代码语言:javascript
复制
module CacheHelper
  # Our FORM is deeply nested in the CACHED_PARTIAl, which we
  # cache. It must be rendered on every request because of its
  # authenticity_token by protect_from_forgery. Instead of splitting up the
  # cache in multiple fragments, we replace a special tag with the custom
  # form.
  def cache_with_bla_form(resource, &block)
    form = nil
    doc = Nokogiri::HTML::DocumentFragment.parse( capture { cache("your_cache_key",&block) } )
    doc.css('uncachable_form').each do |element|
      form ||= render(:partial => 'uncachable_form', :resource => resource)
      element.replace form
    end
    doc.to_html
  end
end

在您的视图中,您只需呈现一个空的uncachable_form标记。

代码语言:javascript
复制
<%- cache_with_bla_form resource do %>
  # cachable stuff..
  <uncachable_form />
  # more cachable stuff
<%- end %>

是的,这可以被认为是Hack,但它不会放松伪造保护,不需要JS,并且只会稍微降低缓存的性能增益。我认为有人实现了类似于机架中间件的模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2384561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档