Php Laravel 5会话闪存在Safari中不工作

Php Laravel 5会话闪存在Safari中不工作,php,session,laravel,safari,Php,Session,Laravel,Safari,我有轻微的安全措施,不允许用户从我的网站下载MP3。Ajax发送一个一次性下载令牌的请求,该令牌被附加到我馈送到soundmanager2的URL。除了在Safari中,这种安全性工作正常 前端请求 streamSong: function(song) { $.ajax({ url: '/streamsong/'+song.id, type: 'get', success: function(token) { var stream = '/streamso

我有轻微的安全措施,不允许用户从我的网站下载MP3。Ajax发送一个一次性下载令牌的请求,该令牌被附加到我馈送到soundmanager2的URL。除了在Safari中,这种安全性工作正常

前端请求

streamSong: function(song)
{
$.ajax({
    url: '/streamsong/'+song.id,
    type: 'get',
    success: function(token) {
        var stream = '/streamsong/'+song.id+'/'+token;
        Player.sendSongToPlayer(song, stream);
    }
});
}

路线

控制器

class StreamController extends Controller {

public function setupStream($id, $token = null)
{
    $stream = new Stream();

    if ($token == null) {
       if (Request::ajax()) {
            $sessionToken = $stream->setToken(str_random(40));
            return response($sessionToken);
        } else {
            return 'no way jose';
        }
    }

    if ($token ==  $stream->getToken() ) {
        return($stream->sendStream($id));
    }
}
}
流类

public function setToken($token)
{
    Session::flash('songToken', $token);
    return($token);
}

public function getToken()
{
    $token = Session::get('songToken');
    return($token);
}

public function sendStream($id)
{
    $post = Post::find($id);
    $pathToFile = base_path().'/storage/app/mp3/'.$post->song_path;
    $fileSize = filesize($pathToFile);
    $name = $post->song_path;
    $headers = array(
        'Content-Type'=>'audio/mpeg',
        'Pragma'=>'public',
        'Content-Transfer-Encoding' => 'binary',
        'Expires'=> 0,
        'Cache-Control'=> 'must-revalidate, post-check=0, pre-check=0',
        'Filename'=>$name,
        'Content-Length'=>$fileSize,
        'Connection'=> 'keep-alive'
    );

    return response()->download($pathToFile, $name, $headers);

}
我得出的唯一结论是Safari对文件下载发出了不止一个请求,因此令牌在第一次尝试时就被销毁了。但是,我在timeline控制台中只看到一个GET请求。如果我将Session::flash设置为Session::set,它在Safari中可以正常工作,但这会绕过安全措施。即使使用Session::set,在发送下载响应之前,我也无法删除Session token变量,这似乎很奇怪


在Safari中还有其他人经历过这样的行为吗?我对此感到非常困惑。

您能在浏览器执行实际请求之前检查它是否执行选项请求吗?有时执行此请求是为了检查服务的功能

会话也可能不是您在这里的最佳选择,您可以创建一个JWT,该JWT将您需要的所有信息保存在其有效负载中,以便一次播放一首歌曲。这很简单,很结实

public function setToken($token)
{
    Session::flash('songToken', $token);
    return($token);
}

public function getToken()
{
    $token = Session::get('songToken');
    return($token);
}

public function sendStream($id)
{
    $post = Post::find($id);
    $pathToFile = base_path().'/storage/app/mp3/'.$post->song_path;
    $fileSize = filesize($pathToFile);
    $name = $post->song_path;
    $headers = array(
        'Content-Type'=>'audio/mpeg',
        'Pragma'=>'public',
        'Content-Transfer-Encoding' => 'binary',
        'Expires'=> 0,
        'Cache-Control'=> 'must-revalidate, post-check=0, pre-check=0',
        'Filename'=>$name,
        'Content-Length'=>$fileSize,
        'Connection'=> 'keep-alive'
    );

    return response()->download($pathToFile, $name, $headers);

}