灵活运用 - 封装ajax自动获取csrf口令 ¶
作者:KK
发表日期:2016.10.18
更新日期:2017.2.19
增加了$.ajaxSetup的设置方式介绍
如果不是用Yii2自带的前端UI组件而是使用自己定义的话,默认情况下那所有POST请求都要附带_csrf
这个参数才可以请求成功
这个参数的值在$('meta[name="_csrf"]').attr('content')
这里
封装多一层ajax ¶
比如使用jQuery,每次$.ajax
的时候都要手动执行$('meta[name="_csrf"]').attr('content')
来获取_csrf口令会很麻烦
所以在这种情况下应该封装一个统一的ajax函数,由这个函数来自动获取,其它所有ajax都调用这个函数就好了,比如我这个简单的例子:
function ajax(options){
if(
options.type
&& options.type.toLowerCase() == 'post'
&& options.data
&& typeof(options.data) == 'object'
){
var csrfToken = $('meta[name="_csrf"]').attr('content');
if(!options.data){
options.data = {};
}
options.data._csrf = csrfToken;
}
return $.ajax(options);
}
用基本的$.ajaxSetup进行统一设置 ¶
在页面初始化时设置一下,让后面所有ajax都用这个beforeSend:
$.ajaxSetup({
beforeSend : function(xhr, options){
if(
options.type
&& options.type.toLowerCase() == 'post'
&& options.data
&& typeof(options.data) == 'object'
){
if(!options.data){
options.data = {};
}
options.data._csrf = $('meta[name="_csrf"]').attr('content');
}
}
});
但这样的缺点就是,如果页面上其中一个ajax请求自主设置了beforeSend就会覆盖这个,所以还是用封装函数会好一点
_csrf口令还能在cookie里取出来 ¶
上面演示代码只是拿meta的而已,其实还能写个代码从cookie里取~