应用程序已按预期运行,直到我添加以下路径显示图像:
Route::get('/images/workers/{imageName}', function($imageName){
if(Auth::check()){
// Intervention using GD does not have functionality for bmp images
//return \Image::make(getenv('IMAGE_DIR') . $imageName)->response();
$filename = getenv('IMAGE_DIR') . $imageName;
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
header("content-type: image/bmp");
echo $contents;
} else {
return \Image::make(getenv('IMAGE_DIR') . 'denied.png')->response();
}
});
在我的一个控制器中,我获取包含这些图像链接的记录,并将它们显示在带分页的表格中。我一次用<img>
个元素显示50条记录,以显示图像(这些是记录的缩略图)。我通常可以按预期显示前几页,但之后我会开始显示我的denied.png
图像,一旦发生这种情况,我发现我已经注销并且必须重新登录。
我阅读Andrew's answer here并得出结论,我发生了竞争条件,这种情况以某种方式破坏了会话并导致帐户被注销。然后我在我的数据库中创建了一个sessions
表,并将laravel中的会话驱动程序更改为database
,但是它看起来不像使用会话驱动程序?那是对的吗?如果是这样,这是一种竞争条件,我怎么能绕过它呢?
使用laravel 5.2.45
修改
其他可能值得注意的是,这个环境正在使用nginx / phpfpm。可能是我的大多数请求都是由一个工作线程处理的,但偶尔会被另一个工作线程处理,而这个线程不知道现有的身份验证会话?或者,无论哪个工作线程通过fpm处理请求并且认证会话都在它们之间持续存在并不重要?
答案 0 :(得分:0)
看来,这个特定的路由包裹着Web中间件处理了这个问题:
Route::group(['middleware' => ['web']], function () {
Route::get('/images/workers/{imageName}', function($imageName){
if(Auth::check()){
// Intervention using GD does not have functionality for bmp images
//return \Image::make(getenv('IMAGE_DIR') . $imageName)->response();
$filename = getenv('IMAGE_DIR') . $imageName;
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
header("content-type: image/bmp");
echo $contents;
} else {
return \Image::make(getenv('IMAGE_DIR') . 'denied.png')->response();
}
});
});