#ios #laravel #session
Вопрос:
Простая цепочка кода и разметки Laravel:
// Initial route
public function play(Request $request)
{
...
$test = session('test');
session()->keep(['test']);
$sid = session()->getId();
Log::debug('session ID before card = ' . session()->getId());
Log::debug('session before card = ' . print_r(session()->all(), true));
return view('front.intro', compact('test', 'sid'));
}
// front.intro view excerpt
@section('content')
<form role="form" method="get"
action="{{ route('player.card') }}">
@csrf
<input type="hidden" name="sid" value="{{ $sid }}">
...
</form>
@endsection
// Subsequent route
public function card(Request $request)
{
Log::debug('session ID inside card = ' . session()->getId());
if($request->has('sid')) {
if($request->sid != session()->getId()) {
Log::debug('session before restore = ' . print_r(session()->all(), true));
session()->setId($request->sid);
Log::debug('session ID restored = ' . session()->getId());
Log::debug('session after restore = ' . print_r(session()->all(), true));
}
}
...
}
Эти коды приводят к следующему входу в систему iOS:
#1: [2021-08-27 04:44:38] local.DEBUG: session ID before card = CWkcUIQPtrrlpFINh10QJ9JpuTgI4zrOWzyiaxCP
#2: [2021-08-27 04:44:38] local.DEBUG: session before card = Array
(
[_token] => fQvKNapYOBqlSTc8h0aDEB2f1Nl0SP6bnYQz3OOd
[test] => AppModelsTest Object ...
[mkey] => ...
[_flash] => ...
)
#3: [2021-08-27 04:44:43] local.DEBUG: session ID inside card = wGIfFgkmyJscg2tl8v5nYt4tpmYihokP2sO3aB83
#4: [2021-08-27 04:44:43] local.DEBUG: session before restore = Array
(
[_token] => 7aGPu7a8XWYgUANCzSTWKSqRz8QwT66gWAUKX31w
)
#5: [2021-08-27 04:44:43] local.DEBUG: session ID restored = CWkcUIQPtrrlpFINh10QJ9JpuTgI4zrOWzyiaxCP
#6: [2021-08-27 04:44:43] local.DEBUG: session after restore = Array
(
[_token] => 7aGPu7a8XWYgUANCzSTWKSqRz8QwT66gWAUKX31w
)
Дайджест:
- В Windows, Mac и Android идентификатор сеанса остается прежним (#1 == #3), поэтому данные сеанса никогда не изменялись (#2 == #4). Отличная работа!
- В сеансе iOS включите новый (#1 != #3), поэтому данные сеанса были удалены (#2 != #4).
keep
не имеет никакого эффекта. И переключитесь на предыдущую сессию, не восстанавливайте данные предыдущей сессии (#2 != #6).
Можно ли предотвратить создание новой сессии в iOS ?
Или меньше — как восстановить старые данные сеанса Laravel по сохраненному идентификатору сеанса ?
Обновить:
I can restore old session by adding session start after setId:
session()->setId($request->sid);
session()->start();
But root of problem (start new session at iOS) remains open.