在令牌不匹配异常后显示flash消息并重定向到另一个页面

时间:2014-07-30 11:35:13

标签: php laravel-4 laravel-routing

我有一个简单的投票应用程序,我试图通过使用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视图并显示闪烁消息通知用户他们正试图作弊。关于如何实现这一目标的任何想法?

1 个答案:

答案 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