進(jìn)行 post 或 put 等方法提交表單的時(shí)候,laravel 會(huì)提示錯(cuò)誤TokenMismatchException 這是因?yàn)閘aravel開(kāi)啟了防csrf。要解決該問(wèn)題有兩種方式,一種是在表單中填寫(xiě)token驗(yàn)證,另一種是在防CSRF時(shí)排除所請(qǐng)求的路由
開(kāi)啟csrf_token
在表單中加上laravel自帶的全局幫助函數(shù)csrf_token()。提交表單的時(shí)候會(huì)自動(dòng)帶上laravel生成的csrf_token()的值,然后在訪問(wèn)路由的時(shí)候laravel會(huì)判斷這個(gè)值。
<form action="/posts" method="post">
<input type='hidden' name='csrf_token' value="{{csrf_token()}}">
<input type="submit" name="提交" />
</form>
或者使用
<form action="/posts" method="post">
{{csrf_field()}}
<input type="submit" name="提交" />
</form>
如果使用 ajax 提交的話
<head>
<title>Laravel 5</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
</head>
<script>
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
url: "{{url('/rsa_post')}}",
type: "post",
dataType: "json",
data: {key: 'value'},
success: function(data){
}
}, 'json');
</script>
排除csrf保護(hù)url
比如要訪問(wèn)的url為 http://www.tjdsmy.cn/posts 現(xiàn)在想排除 posts 相關(guān)資源路由,則在App\\Http\\Middleware\\VerifyCsrfToken::class 中添加路由如下:
protected $except = [
'posts',
'posts/*'
];
注意方法二將無(wú)法對(duì)photo相關(guān)路由進(jìn)行CSRF防護(hù),所以請(qǐng)根據(jù)實(shí)際情況選擇
關(guān)閉csrf保護(hù)
當(dāng)我們不想啟用框架自帶的csrf防護(hù)的時(shí)候,進(jìn)入:laravel/app/Middleware/VerifyCsrfToken.php 找到csrf的中間件,修改代碼如下
public function handle($request, Closure $next){
// 使用CSRF
return parent::handle($request, $next);
// 禁用CSRF
//return $next($request);
}
有的時(shí)候我們既需要開(kāi)啟CSRF防護(hù),又需要在一些特性的post請(qǐng)求時(shí)不帶csrf_token(),laravel框架為我們提供了一個(gè)特殊的屬性。
class VerifyCsrfToken extends BaseVerifier {
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [ // 'upload', 'rsa_post', ];
/* public function handle($request, Closure $next)
{
// 使用CSRF
return parent::handle($request, $next);
// 禁用CSRF
//return $next($request);
}*/
}
這段代碼的意思是利用except來(lái)進(jìn)行路由過(guò)濾。在我們except中的是我們不想被防護(hù)的路由名稱。此處的upload和rsa_post,都是我需要post方式訪問(wèn)的路由。