Сначала у меня был configAuth
с заголовками, включая токен JWT на каждом контроллере.Как разбить перехватчик для разных запросов (URL)?
var configAuth = {
headers: {
'Content-Type': 'application/json',
'Authorization': localStorage.getItem('token')
}
};
Но теперь, когда у меня есть большое количество контроллеров, я понял, что мне нужно что-то сделать. Я слышал о interceptors
и пытался их получить.
Я знаю, что я не могу просто поставить токен на каждый запрос, потому что есть некоторые страницы и запросы, такие как /login
, которые не должны иметь токен Authorization
. И получение html-файлов с Authorization header
каким-то образом дает мне исключение. Так что я пытался разделить запросы так:
angular.module('App')
.factory('sessionInjector',['$injector', function ($injector) {
var sessionInjector = {
request: function (config) {
if (config.url == "/one" || config.url == "/two"){
config.headers['Content-Type'] = 'application/json;charset=utf-8;';
config.headers['Authorization'] = localStorage.getItem('token');
} else {
config.headers['Content-Type'] = 'application/json;charset=utf-8;';
}
return config;
},
response: function(response) {
if (response.status === 401) {
var stateService = $injector.get('$state');
stateService.go('login');
}
return response || $q.when(response);
}
};
return sessionInjector;
}]);
Но она не работает с запросами, как /one/{one_id}
и я не могу жёстко все возможности. Итак, какова наилучшая практика для этого?
Не вдаваясь в лучшие практики, но вы можете легко использовать более гибкие matchers, чем ' config.url == "/ one" '. Например, вы можете проверить, запускается ли url * с помощью «/ one» с помощью 'config.url.indexOf ('/ one') === 0' или с регулярным выражением. Кроме того, если у вас больше маршрутов, требующих авторизации, чем у вас нет, вы можете повернуть проверку другим способом, например 'if (config.url! == '/ login')'. – noppa