ruby-on-rails - Rails 6 - 在 POST 上依赖 204(无内容)让 Jquery 在后台创建记录时更新同一页面是否安全?
问题描述
背景:在 Rails 5+ 中,没有关联 View 的 POST 路由现在只向浏览器返回 204 状态代码(而不是像 Rails 5 之前那样引发 ActionView::MissingTemplate 异常)。据我了解,它告诉所有浏览器“留在同一页面上”。
出于用户体验的原因,当用户单击“提交”时,它会在某个表单上发布表单数据,并且还会触发 Jquery 对页面进行一些更新。
虽然它似乎在开发和生产中都可以正常工作,但是将表单提交返回 204 并在页面上包含 jQuery 更新信息是否有任何不利影响?
解决方案
据我了解,它告诉所有浏览器“留在同一页面上”。
这是不正确的。204 只是服务器告诉客户端“我按照你的要求做了,但我没有更多可以告诉你的”。它不会“告诉浏览器停留在同一页面上” - 如果您阻止了默认操作(提交表单)并且正在发送异步(AJAX)请求,则浏览器将不会响应任何状态代码你回应。由您的 XHR 处理程序对响应执行任何操作。
如果您实际上提交了表单(同步)并得到了204 - No Content
响应,浏览器将呈现一个空白页面或其中一个带有悲伤恐龙的错误页面。它实际上只有 3XX 重定向状态代码以及导致重定向的 Location 标头。
我会说 Rails 使用 204 作为默认值是相当不错的,但它并不是真正的正确响应。如果201 Created
资源是立即创建的,或者202 Accepted
资源是在后台创建的,则使用此选项。然而,这里的差异主要是语义上的,例如 jQuery 只是将所有非 4XX 和 5XX 等同于“好”响应代码,而其余的则触发错误。
推荐阅读
- go - 无法在映射值中使用 my_module.New (type func() (*my_module.MyModule, error)) 作为类型 func() (core.Module, error)
- r - 扩展数据框中的序列并将结果堆叠成一列
- docusignapi - Docusign PARTNER_AUTHENTICATION_FAILED 指定的集成商密钥未找到或被禁用
- javascript - 如何在 react-native 中从 url 播放视频文件
- java - TCP 响应中的字节缓冲区损坏
- android - 在 Kotlin 中测试私有方法
- javascript - 检查消息的作者是否是管理员
- python - while 循环未执行,测试的整数值是否太高?
- javascript - 如何从 javascript 中的 URL 获取图像大小?
- android - 主活动不创建上下文