Отключить заголовок "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);
    }
}
  1. Добавьте его в файл ядра (приложение/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;
}