如何在rails中处理来自应用程序控制器的无效真实性令牌json请求
Posted
技术标签:
【中文标题】如何在rails中处理来自应用程序控制器的无效真实性令牌json请求【英文标题】:How to handle Invalid Authenticity Token json request from application controller in rails 【发布时间】:2019-04-19 14:46:08 【问题描述】:当用户尝试使用脚本或自动化填写表单时,应用程序控制器会引发错误
“ActionController::InvalidAuthenticityToken”
当真正的有效用户填写表单、关闭浏览器、从浏览器历史记录中重新打开页面并提交表单时,就会发生这种情况。
在这种情况下,我不想使用异常通知器发送异常,并且我还想显示带有刷新的请求消息的模式。
所以我把 application_controller 修改为
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
rescue_from ActionController::InvalidAuthenticityToken, with: :handle_csrf_error
def handle_csrf_error(exception)
respond_to do |format|
format.js
render 'invalid_requests/error'
format.html
render text: I18n.t('errors.messages.csrf_error')
end
ExceptionNotifier.notify_exception(exception)
end
end
我想让它适用于所有类型的请求。
我已经为 html & js 请求添加了响应
但不知道如何处理 json 请求。
P.S > json 请求是从 web 应用程序发送的,用于加载更多案例,有时会引发异常,所以希望我来处理。
我的 Rails 版本是 4.2
【问题讨论】:
请注意,CSRF 保护仅适用于 Rails 为视图提供服务的“经典应用程序”(因为客户端需要从表单中获取令牌)并且客户端接受 cookie。对于提供 JSON 的 API,您需要禁用 Rails CSRF 保护。 ***.com/questions/35181340/… 【参考方案1】:在您的控制器中关闭对真实性令牌的检查。
skip_before_action :verify_authenticity_token
见http://***.com/questions/1177863/ddg#1177883
【讨论】:
【参考方案2】:在确保您的 请求 正确地发出 json
请求而不是 js
之后(检查您的 Content-Type
标头)。将format.json
添加到您的服务器响应。
respond_to do |format|
format.json render json: true
end
【讨论】:
以上是关于如何在rails中处理来自应用程序控制器的无效真实性令牌json请求的主要内容,如果未能解决你的问题,请参考以下文章
我的 jquery AJAX POST 请求无需发送真实性令牌(Rails)即可工作
Ruby on Rails - 来自 Paypal 的参数:utf-8 中的无效字节序列