禁用" Cookie"响应json时的标题

时间:2015-02-20 08:46:18

标签: laravel-5

我想在响应为json时禁用(删除)“Cookie”标头。实际上我可以使用Laravel 4.2在过滤器上设置Config::set('session.driver', 'array')

如果我在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}

3 个答案:

答案 0 :(得分:3)

好的,事实证明,在路由中间件中不再可能更改会话/ 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. 在Session中间件之前将其添加到内核文件(app / Http / Kernel.php)中:
  2. [..] ApiSession::class, // Check if an API request. If so, set session, cookie drivers Illuminate\Session\Middleware\StartSession::class, [..]

    不好的一点是你不能将它用于路线组。如果通过检查当前的URL路径来应用此中间件,则必须检查自己。

答案 1 :(得分:0)

无论如何,如果要在所有请求中禁用cookie,可以按原样删除if语句:

some message
.
. # after specified interval
. 
some message
q # program should end

并记得添加/修改你的kernel.php,如“MārtiņšBridis”所示。 现在,您的应用不使用Cookie。

答案 2 :(得分:0)

此代码Config :: set('session.driver','array')禁用laravel_session ...在set-cookie中,Header set和上面的代码禁用了HEADER,但另一个名为Set-Cookie的HEADER存在于XRFF -TOKEN,要禁用此问题,您应该覆盖中间件VerifyCsrfToken。

以下代码添加到app-> 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;
}