作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 javascript 在我的 Rails 站点中进行 ajax 调用:
$.ajax({type: "PUT", url: url, data: { dummy: data }, complete: function(data) {}});
当 Rails 获取它时,它会抛出一个 ActionController::InvalidAuthenticityToken
错误。如果可能的话,我想将 protected_from_forgery 的内容保留在那里......但我不知道如何从 javascript 文件传递身份验证 token ?
谁能帮帮我吗?
最佳答案
在您的布局中,在任何其他 JS 运行之前添加此内容:
<script>
function authToken() {
return '<%= form_authenticity_token if protect_against_forgery? -%>';
}
</script>
authToken
被编码为函数,因此您不太可能意外地用其他 JavaScript 覆盖它。
或者,从 Rails 3 开始,身份验证 token 嵌入为 <meta>
标签,您可以使用以下方式读取:
<script>
function authToken() {
return $('meta[name="csrf-token"]').attr('content');
}
</script>
在你的主 JS 中,你可以调用 authToken()
,它会以字符串形式返回您的真实性 token ,以包含在您的 Ajax 调用中。例如,使用 jQuery:
$.ajax({
type: 'PUT',
url: url,
data: {
foo: bar,
authenticity_token: authToken()
},
complete: function(data) {}
});
请注意,如果您使用 Rails 的内置 form_for
helper,它会自动在隐藏输入中添加真实性 token 。如果您想发送所有表单数据,包括隐藏的身份验证 token ,您只需使用:
var $form = $('form');
$.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
// "get" or "post"; overridden by Rails' hidden "_method"
// input value, e.g., "put"
data: $form.serialize(),
// Includes hidden "authenticity_token" and "_method" inputs
complete: function(data) {}
});
当您已经编写了一个无需 JS 的表单,并且您正在添加一个不显眼的 JS 层(仅通过 Ajax 发送表单数据)时,此模式通常很有用。
关于jquery - 保护免受伪造和不显眼的 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/731504/
我是一名优秀的程序员,十分优秀!