AngularJS: Как обрабатывать ссылки на скачивание с помощью routeprovider? - PullRequest
0 голосов
/ 09 ноября 2018

Я использую AngularJS в своем веб-интерфейсе, и вместе с ним поставляется поставщик маршрутов Раньше мне не нужно было обрабатывать загрузки, поэтому не было проблем с производительностью провайдеров, но теперь у меня возникают проблемы с обработкой ссылок для загрузки в моей настройке.

Здесь ситуация. Маршрутный провайдер имеет маршрут по умолчанию, который перенаправляет на koti.html , и я не могу жестко закодировать ссылку для скачивания, потому что она создается динамически. Из-за этого ссылка для скачивания перенаправляет пользователя обратно на домашнюю страницу.

Я могу успешно использовать ссылку без префикса хэштега, но в этом случае мой перехватчик аутентификации не сработает и не включит мой токен аутентификации в запрос.

Проблема может быть решена двумя способами:

  • Включить динамические ссылки для скачивания через routeprovider
  • Сделать службу перехвата аутентификации включающей токен аутентификации в запросах, которые не проходят через поставщика маршрутов

Какой способ лучше и какие изменения я должен внести, чтобы он заработал?

Вот URL-адрес загрузки, который теперь содержит хэштег из-за моих недавних тестов:

<a target="_self" href="https://www.example.com:8888/#/downloads/public/download.txt">

Вот мой маршрутный провайдер:

.config(['$routeProvider', '$locationProvider', '$httpProvider', function($routeProvider, $locationProvider, $httpProvider){
        $locationProvider.hashPrefix('');
        $httpProvider.interceptors.push('authInterceptorService');
        $routeProvider
                .when('/', {
                templateUrl: 'koti.html',
                controller: 'mainCtrl'
                })
                .when('/testi', {
                templateUrl: 'testi.html',
                })
                .when('/logout', {
                templateUrl: 'logout.html',
                })
                .when('/login', {
                templateUrl: 'login.html',
                })
                .when('/haut', {
                templateUrl: 'haut.html',
                })
                .when('/koti', {
                templateUrl: 'koti.html',
                })
                .when('/loki.html', {
                templateUrl: 'loki.html',
                })
                .when('/raportointi', {
                templateUrl: 'raportointi.html',
                })
                .when('/tulosraportti',{
                templateUrl: 'tulosraportti.html',
                })
                .when('/opiskelijat',{
                templateUrl: 'opiskelijat.html',
                })
                .when('/pk', {
                templateUrl: 'pk.html',
                })
                .when('/varaushaku',{
                templateUrl:'varaushaku.html',
                })
                .otherwise({
                redirectTo: '/koti'
                });
}])

А вот моя служба перехвата аутентификации:

.factory('authInterceptorService', ['$q', '$window', '$localStorage', function($q, $window, $localStorage){
        return {
                'request': function (config){
                        config.headers = config.headers || {};
                        try{
                                if ($localStorage.user.accessToken) {
                                        config.headers.Authorization = 'bearer ' + $localStorage.user.accessToken;
                                }
                                return config;
                        }catch(err){
                                return config;
                        }
                },
                'response' : function(response){
                        headers = response.headers();
                        if(headers.tokenexpired !== 'false' && typeof headers.tokenexpired !== "undefined"){
                                console.log("Expired");
                                delete $localStorage.user
                                window.location = "/";
                        }
                        return response

                },
                'responseError': function(responseError){
                        if(responseError.data.tokenstatus === "expired"){
                                delete $localStorage.user
                                window.location = "/";
                        }
                        else if(responseError.status === 401 || responseError.status === 403) {
                                console.log("forbidden");
                                delete $localStorage.user
                                window.location = "/";
                        } else {
                                window.location = "/";
                        }
                        return $q.reject(responseError);
                }
        };
}])
...