2013-07-24 205 views
3

我曾經使用過此question走了,但得到的答覆張貼他們並沒有解決我的問題。Laravel 4:防止形式重新提交

發生的是,如果用戶點擊瀏覽器的後退按鈕返回到提交表單,輸入的數據仍然存在,並且用戶能夠將問題「補辦」的形式。 如何防止這種行爲(laravel的方式)?

我route.php看起來像

Route::group(array('after' => 'no-cache'), function() 
{ 
Route::get('/', '[email protected]'); 
Route::ANY('/search','[email protected]'); 
Route::get('user/login',array('as'=>'user.login','uses'=>'[email protected]')); 
Route::post('user/login',array('as'=>'user.login.post','uses'=>'[email protected]')); 
Route::get('user/logout',array('as'=>'user.logout','uses'=>'[email protected]')); 
Route::post('user/update/{id}',array('as'=>'user.update','uses'=>'[email protected]')); 
Route::group(array('before' => 'auth'), function() 
{ 
    Route::get('user/profile',array('as'=>'user.profile','uses'=>'[email protected]')); 
    Route::get('order/checkout','[email protected]'); 
    Route::get('order/status',array('as'=>'order.status','uses'=>'[email protected]')); 
    Route::group(array('before' => 'csrf'), function() 
    { 
     Route::post('order/process','[email protected]'); 
    }); 

}); 
}); 

filter.php

Route::filter('csrf', function() 
{ 

if (Session::token() != Input::get('_token')) 
{ 
    throw new Illuminate\Session\TokenMismatchException; 
} 
}); 
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 

}); 

控制器代碼

public function process(){   
    //data is saved to database 
    Session::put('_token', md5(microtime())); 
    return Redirect::route('order.status'); 

} 
public function orderStatus(){ 
    return View::make('orderStatus')->with('message','done'); 
} 
+0

你說他們可以按後退按鈕並且只能「查看」表單 - 或者他們是否可以使用上面的代碼第二次提交表單? – Laurence

+0

@TheShiftExchange他們可以提交表單第二次。 –

+0

你確定你正在使用process()函數嗎?我只是運行你的代碼 - 它的工作原理 - 我不能提交兩次。如果(Session :: token()!= Input :: get('_ token'))改爲if(Session :: token()!='44444')並查看錶單是否默認失敗,也許路線沒有被擊中? – Laurence

回答

1

的轉變交易所:

你確定你的瀏覽器沒有'刷新'頁面當它按 '回' - 因爲'無緩存'?試試這個:加載表單,查看 源代碼,查看@隱藏的令牌代碼。然後提交表格,按回 ,並@查看隱藏的令牌代碼 - 它們是否一樣?

試圖Tobemyself羅喉:

不,他們是不一樣的

然後就是你的答案!當您按下「返回」時,您的瀏覽器正在刷新頁面!

所以,你的代碼「作品」大多數瀏覽器 - 無論但是您正在使用的自動刷新上的「返回」的網頁瀏覽器 - 因此您的令牌被窗體上的重新填充。這是因爲用戶正在'重新訪問'表格 - 所以你可以做的很少,以阻止這種情況。這將適用於大多數的瀏覽器...

或者,你可以關閉「無緩存」的形式 - 或將其設置爲5分鐘喜歡什麼 - 這樣的瀏覽器不會刷新頁面。

也許有一個「形式」緩存過濾器 - 這是5分鐘和所有其他網站的過濾器 - 這是0,這樣的事情是「Laravel優雅」 :)

+0

你是男人....解決了我的問題 –