Отключить заголовок "Cookie" при ответе на json
Я хочу отключить (удалить) заголовок "Cookie", отвечая как json. На самом деле я мог установить Config::set('session.driver', 'array')
на фильтр с Laravel 4.2.
Если я сделал это в L5 (версия 5.0.5), я получил следующую ошибку в файле журнала.
[YYYY-MM-DD ..:..:..] local.ERROR: exception 'ErrorException' with message 'Undefined index: _sf2_meta' in /foo/bar/vendor/laravel/framework/src/Illuminate/Session/Store.php:280
Stack trace:
#0 /foo/bar/vendor/laravel/framework/src/Illuminate/Session/Store.php(280): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined index...', '/foo/bar/ve...', 280, Array)
#1 /foo/bar/vendor/laravel/framework/src/Illuminate/Session/Store.php(251): Illuminate\Session\Store->addBagDataToSession()
#2 /foo/bar/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(89): Illuminate\Session\Store->save()
#3 /foo/bar/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(129): Illuminate\Session\Middleware\StartSession->terminate(Object(Illuminate\Http\Request), Object(Illuminate\Http\JsonResponse))
#4 /foo/bar/public/index.php(57): Illuminate\Foundation\Http\Kernel->terminate(Object(Illuminate\Http\Request), Object(Illuminate\Http\JsonResponse))
#5 {main}
Ответы
Ответ 1
Хорошо, оказывается, что уже невозможно изменить драйвер session/cookie внутри маршрутных посредников. Вы должны указать промежуточное ПО ДОПОЛНИТЕЛЬНОЕ ПО Illuminate\Session\Middleware\StartSession
.
Решение:
1. Создайте собственное промежуточное ПО:
class ApiSession implements Middleware{
public function handle($request, Closure $next){
$path = $request->getPathInfo();
if(strpos($path, '/api/') === 0){
\Config::set('session.driver', 'array');
\Config::set('cookie.driver', 'array');
}
return $next($request);
}
}
- Добавьте его в файл ядра (приложение/Http/Kernel.php) перед промежуточным программным обеспечением сеанса:
[..]
ApiSession::class, // Check if an API request. If so, set session, cookie drivers
Illuminate\Session\Middleware\StartSession::class,
[..]
Плохая часть заключается в том, что вы не можете использовать ее с группами маршрутов. Вы должны проверить свое "я", если это промежуточное программное обеспечение применяется, проверяя текущий URL-адрес.
Ответ 2
В любом случае, если вы хотите отключить куки для всех запросов, вы можете удалить оператор if как есть:
// myapp/app/Http/Middleware/ApiSession.php
<?php
namespace App\Http\Middleware
use Closure;
class ApiSession {
public function handle($request, closure $next){
\Config::set('session.driver', 'array');
\Config::set('cookie.driver', 'array');
}
}
И не забудьте добавить/изменить ваш kernel.php, как показано "Mārtiņš Briedis".
Теперь ваше приложение не использует файлы cookie.
Ответ 3
этот код Config:: set ('session.driver', 'array') отключить laravel_session... что в set-cookie Header set и выше код отключил HEADER, но для HEADER существует еще один HEADER с именем Set-Cookie для XRFF -TOKEN, для отключения этой проблемы вы должны переопределить промежуточное ПО VerifyCsrfToken.
ниже код добавьте в приложение- > Http- > MiddleWare- > VerifyCsrfToken.php и добавьте эту функцию в класс VerifyCsrfToken
protected function addCookieToResponse($request, $response)
{
$config = config('session');
if ($config['driver'] == 'array' || !$this->shouldPassThrough($request))
{
return $response;
}else
{
$response->headers->setCookie(
new Cookie(
'XSRF-TOKEN', $request->session()->token(), time() + 60 * $config['lifetime'],
$config['path'], $config['domain'], $config['secure'], false
)
);
}
return $response;
}