【问题标题】:sync rack request and response同步机架请求和响应
【发布时间】:2016-07-18 05:31:12
【问题描述】:

在我的 rails 4 应用程序中,对于 htmljs 请求,我想用 html 回复。在请求为html 的那一刻,渲染工作正常,但当请求为js 时,html 文件不会在屏幕上呈现(尽管在命令行中它说它已呈现)。

限制请求有不同的场景,因此 html POSTjs POST 请求也可以触发节流代码。

Rack::Attack.throttle(key, limit: from_config(key, :limit), period: from_config(key, :period)) do |req|
  if req.path.ends_with?(from_config(key, :path).to_s) && from_config(key, :method) == req.env['REQUEST_METHOD']
    ### This is the snippet I try to change the req type with but not working
    if req.media_type == 'application/javascript'
      req.media_type = 'text/html'
    end
    ##### till here
    req.ip
  end
end

这是我要渲染的内容。如您所见,这是html 响应。

Rack::Attack.throttled_response = lambda do |env|
  [429, {}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]]
end

我该怎么办?

更新

这是我的最新版本,但不知道如何检查请求内容类型:

Rack::Attack.throttled_response = lambda do |env|
  retry_after = (env['rack.attack.match_data'] || {})[10]
  if env['rack.attack.content_type'] == 'text/html'
    [429, {'Retry-After' => retry_after.to_s}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]]
  elsif env['rack.attack.content_type'] == 'application/javascript'
    [429, {'Retry-After' => retry_after.to_s}, window.location.href = '/429.html']
  end
end

文档:https://github.com/kickstarter/rack-attack

【问题讨论】:

  • 你到底为什么要这么做?创建自定义 mime 类型或使用标头检查它是否是 XHR 请求而不是弄乱现有的 mime 类型之一会更有意义。
  • 如果请求包含 accept: text/html 以外的内容,大多数浏览器也不会将响应呈现为 HTML。
  • max,你能告诉我怎么做吗?我不知道为什么这会搞砸任何事情,因为只有当 sby 超过某些操作的限制时才会发生这种情况。
  • 我有点错过了关于节流的部分,你真的需要/想要返回一个 html 响应吗?如果客户端已被限制,您应该返回 429 和空白响应或包含注释的 javascript,以免破坏实际上可能期望 JS 响应的客户端,并将尝试将响应解析为 javascript。
  • 作为一名开发人员,我会发现这比我的脚本因漂亮的错误页面而炸毁要有用得多。

标签: ruby-on-rails mime-types rack rackattack


【解决方案1】:

我同意@max。原则上,您不应使用 HTML 响应专门针对 JS 的请求。

但是要回答这部分问题:

如何查看请求内容类型:

试着检查一下:

req.env['HTTP_ACCEPT']

说明

  1. reqis an object that subclassesRack::Request.
  2. Rack prependsHTTP_ 添加到客户端的 HTTP 请求标头中,并将它们添加到 env 哈希中。
  3. HTTP clients can indicate what MIME types they accept 位于 Accept 标头中,而不是 Content-Type 标头,它们可以在其中指明要发送给您的数据类型。

【讨论】:

  • monozok,如果您不进行 html 响应,您将如何解决这个问题?如果 sby 假设尝试登录 10 次(这是一个 html post req),那么他将被重定向到一个页面,该页面说他提出了太多请求。但是,当 sby cmets 在帖子线程上过多时,也会发生同样的情况。问题是它是一个 js 请求,因为通常(在请求数量限制内)它应该只用 js sn-p 响应。那么如果在 req 限制内和 html 超过 req 限制,我该如何响应 js?
  • 好的,重新阅读您的最新版本,我看到您正在响应告诉浏览器重定向的 JS。所以我没有问题。我的错!
  • accept 工作正常,但似乎 req.env['HTTP_CONTENT-TYPE'] 不受支持?即使它的有效标题
  • 可能是所有下划线的 HTTP_CONTENT_TYPE?
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2016-07-25
  • 2019-04-24
  • 2018-06-17
相关资源
最近更新 更多