1

Я использую x-auth-token, сгенерированный весной сессией для поддержания связи, это нормально для ajax-запросов. У меня есть проблема, хотя у меня есть файлы , а не. получаемый ajax.Доступ к защищенным статическим файлам при использовании x-auth-token

Эти файлы представляют собой загруженный пользователем контент, pdfs, html с css и шрифтами, в основном, что может сделать браузер, поэтому создание кнопки загрузки ajax force не является вариантом (хотя, возможно, есть способ сделать это, чтобы просмотреть их о котором я не думаю). В настоящее время они просто запрашиваются браузером GET через ссылки <a href, поэтому заголовок не включен.

Я использую AngularJS. Каков наилучший способ решения этой проблемы?

ответ

0

Я знаю, что этот вопрос пару месяцев назад, но я столкнулся с этой проблемой с AngularJS, когда я впервые перешел на использование Spring Session. Это немного взломано, но по сути использует HTTP-код AngularJS для извлечения документа и сохранения его в BLOB в браузере. Затем создается скрытый тег <a> со ссылкой на BLOB, и ссылка на нее программно нажата. У меня есть служба AngularJS под названием «saveBlob», который обрабатывает это:

app.service('saveBlob', ['$http', function ($http) { 
return { 
    download: function(url, fileName) { 
     $http.get(url, { responseType: 'arraybuffer' }).then(function(response) { 
      var blob = new Blob(
        [ response.data ], 
        { type: response.headers('Content-Type') } 
       ); 
      var objUrl = window.URL.createObjectURL(blob); 
      var a = document.createElement("a"); 
      document.body.appendChild(a); 
      a.style = "display: none"; 
      a.href = objUrl; 
      if (fileName) { 
       a.download = fileName; 
      } 
      else { 
       var regex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g; 
       var match = regex.exec(response.headers('Content-Disposition')); 
       var fn = match[1]; 
       a.download = fn.substring(1, fn.length - 1); 
      } 
      a.click(); 
      window.URL.revokeObjectURL(url); 
     }); 
    } 
} 
}]); 

Служба «saveBlob» тогда называется директивой под названием «httpHref»:

app.directive('httpHref', ['$http', 'saveBlob', function ($http, saveBlob) { 
return { 
    link: function ($scope, elem, attrs) { 
     function revokeObjectURL() { 
      if ($scope.objectURL) { 
       URL.revokeObjectURL($scope.objectURL); 
      } 
     } 

     $scope.$watch('objectURL', function (objectURL) { 
      elem.attr('href', objectURL); 
     }); 

     $scope.$on('$destroy', function() { 
      revokeObjectURL(); 
     }); 

     attrs.$observe('httpHref', function (url) { 
      elem[0].onclick = function() { 
       saveBlob.download(url); 
      }; 
     }); 
    } 
}; 
}]); 

Я приспособил этот код из This GitHub Repository (который лицензируется по лицензии MIT), поэтому благодарим вас за вкладчиков этого проекта за помощь в этом!

+0

может быть кому-то полезен, я переехал в Aurelia, но я уверен, что смогу найти способ конвертировать его в aurelia/fetch api – xenoterracide

Смежные вопросы