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 storagestorage/session 文件夹具有权限。

您还可以检查该文件上的lifetimeexpire_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 抱歉,您的会话已过期。请刷新并重试

在 Laravel 5.8 中会话过期时重定向到其他路由

会话过期的 laravel 事件监听器,因为会话过期时没有调用注销事件监听器

Laravel 5.3记住我身份验证问题

Laravel 5.3记住我身份验证问题