灵活运用 - 封装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里取~