2015-05-15 21 views
5

Ho un semplice player html5, implementato con videoJS. Per recuperare correttamente i file sorgente dal server, ho bisogno di impostare un'intestazione personalizzata nella richiesta per il video.C'è un modo per includere un'intestazione http personalizzata in una chiamata di origine <video>?

Poiché l'applicazione utilizza AngularJS, ho implementato un intercettore per impostare l'intestazione:

myApp.factory('headerInterceptor', function() { 
    return { 
    request: function (config) { 
     config.headers['my-header'] = 'test'; 
     return config; 
    } 
    }; 
}); 

myApp.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('headerInterceptor'); 
} 

Problemi con questa, è che la chiamata al video non viene catturato da esso, in modo che nessun intestazione è impostato (it è però per altre risorse). Quindi angolare non carica i video. Nessuna grande sorpresa in questo. Controllo della scheda di rete nei tool di sviluppo, ha scoperto che videoJS avvia la chiamata:

failed source retrieval

Ma trovare la mia strada nel plugin videoJS è stato difficile, e couln't trovare dove le chiamate sono effettuate. Mi sto solo chiedendo, c'è un modo semplice per impostare l'intestazione per questa chiamata? non importa se è semplice javascript, o attraverso angolare, o anche modificando il plugin videoJS.

+0

Perché è necessario impostare un'intestazione richiesta di una risorsa statica? – charlietfl

+0

La chiamata va attraverso un proxy che verifica l'intestazione – ezabaw

+0

hai trovato qualche soluzione tranne l'utilizzo del plugin HLS? – D0dger

risposta

4

All'interno di un blocco di esecuzione angolare, è possibile eseguire l'override della funzione XHR beforeRequest del plug-in videojs. YMMV, ma se si utilizza HLS plug-in, ad esempio, si potrebbe fare qualcosa di simile:

angular.module('app', []).run(function($localStorage) { 

    var _beforeRequest = _.isFunction(videojs.Hls.xhr.beforeRequest); 
    videojs.Hls.xhr.beforeRequest = function(options) { 
     if (_beforeRequest) { 
      options = _beforeRequest(options); 
     } 
     if ($localStorage.token) { 
      options.headers = options.headers || {}; 
      options.headers.Authorization = 'Token ' + $localStorage.token; 
     } 
     return options; 
    }; 
}); 
+0

Puoi consigliare come può essere fatto senza il plugin HLS? – D0dger

+0

@ D0dger: quale plugin stai usando? Immagino che i plug-in di VideoJS utilizzino un'API coerente, quindi ognuno dovrebbe esporre un oggetto xhr con una funzione beforeRequest. Fammi sapere. – blokfyuh

+0

Espone xhr, ma non lo utilizza per le richieste video (solo i sottotitoli e i poster), oppure non ho capito come viene utilizzato. Per ora ho aggiunto il token per richiedere il parametro – D0dger

1

ero imbattuto in questo problema pure. Volevo inviare un'intestazione di autorizzazione insieme a tutti i video e le immagini richiesti al mio sito e utilizzare il tag video nativo HTML5. Dopo aver cercato per molto tempo, non sono stato in grado di trovare alcuna soluzione che consentisse intestazioni personalizzate. Alla fine, ho deciso di creare un cookie all'inizio dell'applicazione. Poiché i cookie vengono inviati su ogni richiesta, sono stato in grado di configurare la mia API Web per cercare questo cookie solo quando sono richieste immagini e video. In questo modo il resto del sito avrebbe continuato a utilizzare l'intestazione di autorizzazione.

ngCookies dovevano essere aggiunti alla domanda:

var app = angular.module('myApp', ['ngCookies']); 

Poi alla partenza dell'applicazione:

app.run(['$cookies', function ($cookies) { 
     $cookies.put("[COOKIE_NAME]", "[TOKEN]"); 
} 
+1

Potresti approfondire questa soluzione? Come riesci a impostare i cookie per diversi domini? Imposta 'xhr.withCredentials = true'? – mkorszun