8

AngularJS インターセプターを使用すると、URL をチェックせずに、ビューなどの静的リソースに対して Angular 自体によって行われた要求から $http へのアプリ呼び出し ($resource を介して直接)​​ を区別することは可能ですか?

次のように、HTTP インターセプターにカスタム認証ヘッダーを追加しています。

transparentAuthServices.factory('authHttpInterceptor',
  function (localSessionStorage) {
    return {
      'request': function (config) {
        if (!config.ignoreAuthInterceptor && localSessionStorage.hasSession()) {
          var sessionId = localSessionStorage.getSession().sessionId;
          config.headers['Authorization'] = 'ARTAuth sessionId="' + sessionId + '"';
          return config;
        } else {
          return config;
        }
      }
    }
  };
});

正常に動作しますが、静的リソースの承認は必要なく、サーバーはそれらをチェックしません。URL を確認して、「/app」で始まる URL をスキップすることもできますが (私の場合)、エレガントな解決策はありますか?

4

2 に答える 2

8

私の実験では、テンプレートのリクエストの場合、configオブジェクトにはcacheプロパティがあり、 を呼び出すとconfig.cache.info()オブジェクトが返されることがわかりました。

{id: "templates", size: 7}

これはおそらく、URL を検査せずに行う唯一の信頼できる方法です。

スタック トレースも調べてみましたが、成功しませんでした。合理的なパターンを見つけるのは難しく、信頼すべきではありません。

それでも私の意見では、最善の方法は URL を確認することです。

于 2013-11-16T22:44:33.817 に答える
1

ちょっとした調査の結果、テンプレート リクエストは、テキスト/html の Accept ヘッダーを使用して作成されているため、すばやく処理できるという仮説が立てられました。多くのプラグインは、テンプレートをロードするためにそれに従わないようですが、URL にいくつかの indexOf を指定すると、それがクリーンアップされる場合があります。私の例:

$httpProvider.interceptors.push(function () {
            return {
                request: function(config) {
                    if (config.url.indexOf('http') != 0
                        && config.headers.Accept !== 'text/html' /* Excludes template requests */
                        && config.url.indexOf('html') === -1 /* some plugins do requests with html */
                        && config.url.indexOf('tpl') === -1 /* match any template naming standards */) {
                        if (config.url.indexOf('/') == 0) {
                            config.url = apiEndpoint + config.url;
                        } else {
                            config.url = apiEndpoint + '/' + config.url;
                        }
                    }

                    return config;
                }
            }
        });

于 2015-11-10T08:58:57.517 に答える