我有一个简单的Ruby on Rails表单,其中包含一个authenticity_token。不幸的是,我错过了当你页面缓存这个页面时,真实性令牌变得无效。我很高兴我弄明白了这一点。
在这种情况下,如何解决缓存问题?
发布于 2010-03-16 01:35:37
正如Matchu发布的,你可以从this post实现第二点(与他发布的链接相同,但也可以通过我的谷歌找到)。这增加了对JavaScript的依赖,这可能是您想要的,也可能不是。
或者,您可以查看Fragment Caching。这允许您缓存页面的某些部分,但仍会生成动态部分(例如具有真实性令牌的表单)。使用这种技术,您可以缓存页面的其余部分,但会为每个请求生成一个新表单。
最后一种解决方案(但最不利的)是禁用该特定操作的真实性令牌。您可以通过将以下内容添加到生成该表单的控制器的开头来完成此操作:
protect_from_forgery :except => [:your_action]也可以通过在开头添加以下内容来禁用整个控制器的protect_from_forgery:
skip_before_filter :verify_authenticity_token发布于 2010-03-05 12:37:57
这似乎不是一个很好解决的问题。Point two on this blog post描述了如何使用jQuery来完成任务,但这引入了Javascript依赖。权衡一下你的选择,我想。
发布于 2012-07-25 22:20:25
您可以在缓存的标记中呈现一个自定义标记,并将其替换为在每次请求时呈现的表单。
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标记。
<%- cache_with_bla_form resource do %>
# cachable stuff..
<uncachable_form />
# more cachable stuff
<%- end %>是的,这可以被认为是Hack,但它不会放松伪造保护,不需要JS,并且只会稍微降低缓存的性能增益。我认为有人实现了类似于机架中间件的模式。
https://stackoverflow.com/questions/2384561
复制相似问题