Php Laravel 5会话闪存在Safari中不工作
我有轻微的安全措施,不允许用户从我的网站下载MP3。Ajax发送一个一次性下载令牌的请求,该令牌被附加到我馈送到soundmanager2的URL。除了在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
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);
}