yii2如何防止重復(fù)提交表單

yii2如何防止重復(fù)提交表單

yii2利用csrf防止表單重復(fù)提交

首先,默認(rèn)情況下,yii2的csrf驗(yàn)證是通過cookie來保存token驗(yàn)證的,要實(shí)現(xiàn)防止表單重復(fù)提交,得先把這個(gè)方式改成session。

修改項(xiàng)目配置即可實(shí)現(xiàn) ? ? ? ? ? ?(推薦學(xué)習(xí):yii框架

'components'?=>?[ 	'request'?=>?[ 		'enableCsrfCookie'?=>?false 	] ]

然后,csrf驗(yàn)證通過后,在進(jìn)入下一次get請(qǐng)求之前是不會(huì)刷新或者清除session里保存的那個(gè)csrf token的,而驗(yàn)證csrf的地方在控制器的beforeAction方法里,源碼?yiiwebController?如下

/** *?@inheritdoc */ public?function?beforeAction($action) { 	if?(parent::beforeAction($action))?{ 		if?($this->enableCsrfValidation?&&?Yii::$app->getErrorHandler()->exception?===?null?&&?!Yii::$app->getRequest()->validateCsrfToken())?{ 			throw?new?BadRequestHttpException(Yii::t('yii',?'Unable?to?verify?your?data?submission.')); 		} 		return?true; 	} ? 	return?false; }

改源碼當(dāng)然不好,所以建個(gè)新控制器繼承該控制器實(shí)現(xiàn)beforeAction方法

public?function?beforeAction($action) { 	if?(parent::beforeAction($action))?{ 		if?($this->enableCsrfValidation)?{ 			Yii::$app->getRequest()->getCsrfToken(true); 		} 		return?true; 	} ? 	return?false; }

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享