我有一個單頁應用程式,它正在計算多個 AJAX 請求,通過axios. 有時,我會遇到兩個請求同時運行異步并嘗試寫入會話的情況,這會導致419回應代碼在回應CSRF中丟棄令牌,從而迫使我必須注銷用戶。
除錯后,我遇到了使用原子鎖的會話阻塞。
我的會話提供者是資料庫,我擁有 Laravel 附帶的標準模式來實作此功能。目前,我必須在我的路線上指定這一點,如下所示:
Route::any('/example', [SomeController::class, 'someFunction')->block();
但是,我有大量路由,并且由于應用程式是 SPA,有沒有辦法在服務提供商級別默認實作這一點?
這是不可能的,Route::group(...)->block()這是我最初嘗試的。
uj5u.com熱心網友回復:
實作這一點有點痛苦。但在我提出解決方案之前,先做一個簡短的分析:
該Route::block($lockSeconds = 10, $waitSeconds = 10)方法在內部設定屬性lockSeconds和waitSeconds路由。如果將這兩個屬性添加到組定義中,它們實際上是傳遞給路由的,但不幸的是在 sub key 下action:
Route::group(['lockSeconds' => 10, 'waitSeconds' => 10, 'prefix' => 'api/spa'], function () {
Route::get('foo', fn () => response()->json(['result' => 'ok']));
});
// Dump of the route
"api/spa/foo" => Illuminate\Routing\Route {#217 ▼
uri: "api/spa/foo"
methods: array:2 [?]
action: array:5 [▼
"middleware" => array:1 [?]
"uses" => Closure() {#216 ?}
"namespace" => null
"prefix" => ""
"where" => [],
"lockSeconds" => 10, <-- we got the setting here
"waitSeconds" => 10 <--
]
isFallback: false
controller: null
defaults: []
wheres: []
parameters: null
parameterNames: null
#originalParameters: null
#withTrashedBindings: false
#lockSeconds: null <-- we want the setting here though
#waitSeconds: null <--
computedMiddleware: null
compiled: null
#router: Illuminate\Routing\Router {#25 ?}
#container: Illuminate\Foundation\Application {#3 ?}
#bindingFields: []
}
這給我們留下了無法在路由注冊期間定義這兩個屬性的情況。但幸運的是,我們還可以在將路由添加到路由集合后對其進行操作:
foreach (Route::getRoutes() as $route) {
$route->block();
}
這段代碼最好放在您的底部routes/web.php或. 您還可能希望在執行此操作時過濾您的路由,并且只更新以給定前綴開頭的路由:map()RouteServiceProvider
foreach (Route::getRoutes() as $route) {
if (str_starts_with($route->uri(), 'api/spa')) {
$route->block();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/495487.html
上一篇:自定義PHP會話管理
下一篇:電報機器人會話未運行
