Laravel 会话立即过期(Laravel 5.5)
Posted
技术标签:
【中文标题】Laravel 会话立即过期(Laravel 5.5)【英文标题】:Laravel session expires immediately (Laravel 5.5) 【发布时间】:2018-03-29 11:53:05 【问题描述】:我已经创建了我的自定义模型来登录用户。我正在使用 sqlite 作为数据库。 “users”表有“id”列,我没有使用 eloquent,所以我在 auth.config 文件中将驱动程序更改为“database”,将表更改为“users”。
我的索引控制器检查用户是否登录。如果没有,重定向到登录页面。一旦提交登录表单(ajax 调用),如果用户输入错误的用户名或密码,它会在模式中收到错误消息,告诉它输入了错误的凭据。如果用户名和密码为真,则重定向到索引页面。但是因为没有假定用户已登录,所以它再次重定向到登录页面。此外,我尝试在成功尝试(不重定向)后回显用户的 id,并且显示没有问题。但是在访问索引页面后,我又被重定向到登录页面。
我已经尝试添加会话并显示它,所以如果我调用以下代码;
session()->put('foo', 'bar');
echo session()->get('foo');
“bar”在页面上回显。但是,如果我在另一个页面上回显会话(因为我已经添加了新会话而没有放置新会话),则不会在页面上回显“栏”。
另请注意,“storage/framework/sessions”文件夹中没有存储任何文件。
会话类型是文件,生命周期是 720。我也尝试过“cookie”和“数据库”。 “cookie”也出现了同样的问题,但“数据库”驱动程序出现“无法使用数据库驱动程序”异常(我已成功迁移必要的表)。
该网站也位于 localhost (Windows 10) 上。所以我认为文件夹权限不是问题。此外,我在同一台电脑上还有另一个 Laravel(旧版本 - 我认为它必须是 5.4),它可以正常工作。两者都使用 php 7 和 nginx 服务器。
【问题讨论】:
附带说明 - 如果您忘记在登录刀片的表单中输入@csrf
,也会发生 419“您的会话已过期”:)
【参考方案1】:
检查文件config/session.php
上的会话配置。
如果您的会话驱动程序是文件,请确保您对具有chmod -R 777 storage
的storage/session
文件夹具有权限。
您还可以检查该文件上的lifetime
和expire_on_close
配置以保留请求之间的会话。
【讨论】:
感谢您的回答,但我已经在我的问题中提到了这些注意事项。【参考方案2】:所以我发现了我的问题。我创建了一个自定义 ServiceProvider 并定义了自定义路由来创建模块化系统。因为我试图在这里“包含”路由文件,所以新的 laravel 路由系统将其作为 api 路由。所以会话不可用。
现在我已将代码更改为:
Route::middleware('web')->group($route_file);
并且路由表现为网络路由和会话正在工作。
希望看到这可以帮助其他遇到此问题的人。
【讨论】:
能否提供路由文件内容的示例内容?我现在也有类似情况 这个问题不是关于路由文件本身,而是如果你想使用你的自定义路由文件。您可以在服务提供者中注册一个新的路由文件(当然您可以使用 AppServiceProvider)。将上面的代码添加到“boot”函数中。 $route_file 变量是自定义路由文件的路径。只需像往常一样在此文件中添加您的路线。如果要将中间件用于 api 路由,可以将中间件从“web”更改为“api”。您也可以像在路由文件中一样在上面的代码中添加“前缀”、“名称”。您在此文件中定义的路由将以前缀和名称开头。以上是关于Laravel 会话立即过期(Laravel 5.5)的主要内容,如果未能解决你的问题,请参考以下文章
修复 laravel 5 会话在刷新或进入另一个页面后过期?
laravel 5.7.15 419 抱歉,您的会话已过期。请刷新并重试