默认情况下,Laravel会在每个请求上设置一个名为[APP_NAME]_session的Cookie。它用于redirect()->back()
等功能。
这个cookie阻止了我的缓存机制正常工作(FastCGI,Varnish,你能想到的)
如果我百分之百确定我不需要它,有没有一种方法可以在用户未进行身份验证时删除此cookie,而不会阻止他们像往常一样登录?
当我的用户被验证时,我想显示一个不同的菜单,所以我不能在某些路由上应用不同的中间件。
我创建了一个新类,它扩展了StartSession中间件(在app/Middleware/Kernel.php
中引用,在web
组中)。
<?php
namespace AppHttpMiddleware;
use IlluminateContractsSessionSession;
use IlluminateHttpRequest;
use IlluminateSupportFacadesCookie;
use SymfonyComponentHttpFoundationResponse;
class StartSession extends IlluminateSessionMiddlewareStartSession
{
/**
* Start the session for the given request.
*
* @param Request $request
* @param Session $session
* @return Session
*/
protected function startSession(Request $request, $session): Session
{
return tap($session, function ($session) use ($request) {
$session->setRequestOnHandler($request);
if (Cookie::get(config("session.cookie"))) {
$session->start();
}
});
}
/**
* Add the session cookie to the application response.
*
* @param Response $response
* @param Session $session
* @return void
*/
protected function addCookieToResponse(Response $response, Session $session)
{
if (!auth()->check()) {
return;
}
if ($this->sessionIsPersistent($config = $this->manager->getSessionConfig())) {
$response->headers->setCookie(new SymfonyComponentHttpFoundationCookie(
$session->getName(), $session->getId(), $this->getCookieExpirationDate(),
$config['path'], $config['domain'], $config['secure'] ?? false,
$config['http_only'] ?? true, false, $config['same_site'] ?? null
));
}
}
}
两个重要部分是:
startSession()中的- :
if (Cookie::get(config("session.cookie"))) {
$session->start();
}
此部分防止在用户尚未进行身份验证时创建会话。
- 在addCookieToResponse()中:
if (!auth()->check()) {
return;
}
这一部分防止Laravel设置cookie,只要用户没有经过身份验证。