我有一个简单的投票应用程序,我试图通过使用csrf标记使用后退按钮来防止双重提交。我的路线看起来像这样
Route::group(array('before' => 'csrf'), function(){
Route::post('votesuccess', array('as' => 'votesuccess', 'uses'=>'VoteController@votesuccess'));
});
我的过滤器看起来像这样
Route::filter('csrf', function()
{
if (Session::token() != Input::get('_token'))
{
return Response::to('voteresults');
Session::flash('message', 'You are trying to vote twice!');
}
});
Route::filter('no-cache',function($route, $request, $response){
header("Cache-Control: no-cache,no-store, must-revalidate"); //HTTP 1.1
header("Pragma: no-cache"); //HTTP 1.0
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
});
我的控制器的一部分看起来像这样
Session::put('_token', md5(microtime()));
// redirect
Session::flash('message', 'Successfully Cast your vote!');
return Redirect::route('voteresults');
它工作正常,如果有人点击后退按钮并尝试重新提交它会带来Illuminate \ Session \ TokenMismatchException
,这一切都很好,除非我希望它重定向到voteresults
视图并显示闪烁消息通知用户他们正试图作弊。关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
您需要为TokenMismatchException
创建一个处理程序,这个地方可以放在start/global.php
中,看起来像
App::error(function(TokenMismatchException $exception)
{
Session::flash('message', 'You are trying to vote twice!');
return Redirect::to('voteresults');
});
有关在Laravel中处理异常的更多信息,请查看here